Добавление строки в data.table работает иначе, чем в data.frame: как и почему? - PullRequest
6 голосов
/ 22 января 2020

Почему следующий код не работает?

library(data.table)
team_table <- as.data.table(matrix(NA,ncol = 11))
rbind(team_table,1:11)

Хотя та же версия с data.frame работает?

team_table <-as.data.frame(matrix(NA,ncol = 11))
rbind(team_table,1:11)

Ответы [ 2 ]

5 голосов
/ 22 января 2020

Преобразование в list, и оно должно работать

rbind(team_table,as.list(1:11))
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
#1: NA NA NA NA NA NA NA NA NA  NA  NA
#2:  1  2  3  4  5  6  7  8  9  10  11

Это также то же самое поведение с data.frame

rbind(team_table,as.list(1:11))
#  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
#1 NA NA NA NA NA NA NA NA NA  NA  NA
#2  1  2  3  4  5  6  7  8  9  10  11

Относительно того, почему это не удается, rbind in data.table вызывает rbindlist и рассматривает вектор (1:11) как один столбец.

rbind(team_table,1:11)

Ошибка в списке rbindlist (l, use.names, fill, idcol): элемент 2 имеет 1 столбец, что не соответствует элементу 1, в котором 11 столбцов. Чтобы заполнить пропущенные столбцы, используйте fill = TRUE.

Если мы преобразуем его в list с 11 элементами (data.frame или data.table равны list с элементами списка, то есть столбцами одинаковой длины ), это работает, потому что он будет считать количество столбцов одинаковым

2 голосов
/ 22 января 2020

Поскольку 1:11 рассматривается как столбец, мы можем транспонировать значения в rbind это как строку

library(data.table)
team_table <- as.data.table(matrix(NA,ncol = 11))
rbind(team_table,t(1:11))

#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
#1: NA NA NA NA NA NA NA NA NA  NA  NA
#2:  1  2  3  4  5  6  7  8  9  10  11
...