如何一次性向data.frame中添加多个列?

8fsztsew  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(249)

我有以下dataframe和vector:

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

我如何在dataframe中添加新的空列,这些列的名称是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 "}"
yhxst69z

yhxst69z1#

这将让你在那里:

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")],或者像ddf[xx]这样的存储向量。
它选择列的原因是因为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"],默认情况下你会得到列。
如果您正在使用0行数据集,则不能使用像NA这样的值作为替换。而是使用list(character(0))替换,其中character(0)可以替换为numeric(0)integer(0)logical(0)等,具体取决于您想要为新列使用的类。

ddf <- data.frame(a=character())
xx <- c("c", "d", "e", "f")
ddf[xx] <- list(character(0))
ddf
#[1] a c d e f
#<0 rows> (or 0-length row.names)
8wtpewkr

8wtpewkr2#

这似乎是成功的:

> 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

相关问题