2016-09-05 1 views
0

Почему это работает,Ошибка при добавлении столбцов со значениями по умолчанию для dataframe с нулевыми строками

# add ONE column to dataframe with zero rows 

x <- data.frame(a=character(0)) 
x["b"] <- character(0) 

в то время как это не делает?

# add SEVERAL columns to dataframe with zero rows 

x <- data.frame(a=character(0)) 
x[c("b", "c")] <- character(0) 

error in value[[jvseq[[jjj]]]] : index out of limits [... freely translated] 

Обратите внимание, что это совершенно нормально, если у нас есть ненулевые строки.

x <- data.frame(a=1) 
x["b"] <- NA 

x <- data.frame(a=1) 
x[c("b", "c")] <- NA 

А что будет простая альтернатива, чтобы добавить несколько столбцов в ноль dataframes строк?

+2

'cbind (х, Ь = символ (0), с = символ (0))'. – r2evans

+0

'cbind (x, as.data.frame (matrix (0, ncol = 42, nrow = 0)))' для многих столбцов. –

+0

К сожалению, это не помогает мне, поскольку я не знаю заранее, какие имена столбцов будут. Во всяком случае, я мог бы, конечно, цикл: 'for (m in c (" a "," b ")) x [[m]] <- character (0)' –

ответ

1

От help("[.data.frame"):

кадры данных могут быть проиндексированы в нескольких режимах. Когда [и [[используются с одним векторным индексом (x [i] или x [[i]]), они индексируют кадр данных , как если бы это был список.

От help("["):

Рекурсивных (список-подобный) объекты

индексироваться [похоже на атомные векторы и выбирает список указанного элемента (ов).

Таким образом, вам нужно сделать, передать список (или data.frame):

x <- data.frame(a=character(0)) 
x[c("b", "c")] <- list(character(0), character(0)) 
str(x) 
#'data.frame': 0 obs. of 3 variables: 
# $ a: Factor w/ 0 levels: 
# $ b: chr 
# $ c: chr 
+0

Ну, мне лучше RTFM. хорошо, спасибо: D –

Смежные вопросы