R rbind dataframes возвращает список

Я столкнулся с проблемой, и мне удалось решить ее с помощью взлома, и я хочу понять проблему и, надеюсь, избавиться от взлома.

Я пытался воссоздать проблему безрезультатно, поэтому слов здесь будет достаточно.

Я пытаюсь rbind два фрейма данных в R, результатом чего снова должен быть фрейм данных, а не список. Я использую rbind в большинстве своих скриптов, и раньше у меня никогда не было проблем.

Однако сегодня я применил rbind к двум кадрам данных, скажем, foo и bar, и он вернул list foobar. Хак, который я использую, чтобы исправить это, заключается в принудительном преобразовании foo и bar в кадры данных снова следующим образом:

rbind(data.frame(foo), data.frame(bar))

Это работает, но я хотел бы знать, почему я должен преобразовывать его явно, когда и foo, и bar уже являются data.frames.

Тогда мой вопрос заключается в том, в каких «общих» сценариях rbind будет возвращаться list, когда оба входа являются data.frames?

Я попытался отладить его, посмотрев на rbind(A,A) и rbind(B,B). Оба раза он возвращает кадр данных, а не list. Почему тогда rbind(A,B) возвращает list?

Спасибо!


person gmarais    schedule 11.01.2018    source источник
comment
Трудно сказать, не имея доступа к foo и bar   -  person bouncyball    schedule 11.01.2018
comment
Меня устраивает. Убедитесь, что у вас такое же имя переменной.   -  person patL    schedule 11.01.2018
comment
@patL Откуда вы знаете, что это работает для вас, если вы не видели фактических данных ОП?   -  person Tim Biegeleisen    schedule 11.01.2018
comment
Я думаю, что foo и bar на самом деле не являются кадрами данных, возможно, кадрами данных в списке или списке векторов. Пожалуйста, dput эти объекты для нас.   -  person Parfait    schedule 11.01.2018
comment
@Parfait, согласно бритве Оккама, ты прав. Я ПРЕДПОЛАГАЛ, что bar был data.frame, но на самом деле это tibble... что для меня совершенно новое! закрыть вопрос?? Спасибо за помощь   -  person gmarais    schedule 11.01.2018
comment
Поскольку это не поможет будущим читателям, а просто упустит из виду вашу среду, удаление этого может быть оправдано.   -  person Parfait    schedule 11.01.2018
comment
@gmarais, если это таблетка, попробуйте dplyr::bind_rows() вместо rbind()? Это может решить вашу конкретную проблему.   -  person Phil    schedule 11.01.2018
comment
@Фил, это сработало, спасибо! К сожалению, я задал не тот вопрос... Я думаю, вы все равно можете опубликовать ответ и объяснить, что ваше решение работает, когда foo или bar не являются гарантированными кадрами данных. Я с радостью приму его, поскольку он «решает» мою проблему.   -  person gmarais    schedule 11.01.2018


Ответы (1)


Если один из ваших фреймов данных на самом деле является tibble, вам нужно будет использовать dplyr::bind_rows() вместо rbind(), поскольку dplyr::bind_rows() специально разработан для работы с табличками (он также работает с фреймами данных в целом). Поскольку тайблы — это изобретение tidyverse, они не обязательно полностью совместимы с базовыми функциями, такими как rbind() (сам я не знал, что такое поведение произойдет, пока вы не упомянули об этом).

Дополнительную информацию о разнице между двумя функциями и о том, почему вы можете использовать dplyr::bind_rows() вместо rbind(), можно найти здесь.

person Phil    schedule 11.01.2018
comment
Спасибо за этот ответ. Хотя я согласен, что вопрос был не самым лучшим, я боролся с точно такой же проблемой: почему простой rbind дал только список, а не data.table. - person W Barker; 19.03.2021