Как добавить несколько столбцов в data.frame за один раз?

У меня есть следующий файл данных и вектор:

ddf = data.frame(a=rep(1,10), b=rep(2,10))
xx = c("c", "d", "e", "f")

Как я могу создать новые пустые столбцы, имена которых указаны в xx?

Я пробовал следовать, но он не работает:

ddf = cbind(ddf, data.frame(xx))
Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 10, 4

Далее также не работает:

for(i in 1:length(xx)){
    ddf$(xx[i]) = ""  
}

Error: unexpected '(' in:
"for(i in 1:length(xx)){
ddf$("
 }
Error: unexpected '}' in "}"

Ответ 1

Это доставит вас туда:

ddf[xx] <- NA

#   a b  c  d  e  f
#1  1 2 NA NA NA NA
#2  1 2 NA NA NA NA
#3  1 2 NA NA NA NA
#...

Вы не можете напрямую использовать что-то вроде ddf$xx потому что это попытается присвоить столбец с именем xx вместо интерпретации xx. Вам нужно использовать [ и [<- функции, используя квадратные скобки, когда вы имеете дело с символьной строкой/вектором, например ddf["columnname"] или ddf[c("col1","col2")].

Причина, по которой он выбирает столбцы, заключается в том, что data.frames по сути являются списками:

is.list(ddf)
#[1] TRUE

as.list(ddf)
#$a
# [1] 1 1 1 1 1 1 1 1 1 1
# 
#$b
# [1] 2 2 2 2 2 2 2 2 2 2

... с каждым столбцом, соответствующим записи в списке. Поэтому, если вы не используете запятую для указания строки, например ddf["name",] или столбца, например ddf[,"name"], вы получите столбец по умолчанию.

Ответ 2

Это кажется успешным:

> cbind(ddf, setNames( lapply(xx, function(x) x=NA), xx) )
   a b  c  d  e  f
1  1 2 NA NA NA NA
2  1 2 NA NA NA NA
3  1 2 NA NA NA NA
4  1 2 NA NA NA NA
5  1 2 NA NA NA NA
6  1 2 NA NA NA NA
7  1 2 NA NA NA NA
8  1 2 NA NA NA NA
9  1 2 NA NA NA NA
10 1 2 NA NA NA NA