【问题标题】:How to add multiple columns to a data.frame in one go?如何一次性将多个列添加到 data.frame?
【发布时间】:2014-08-18 06:04:59
【问题描述】:

我有以下数据框和向量:

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 "}"

【问题讨论】:

    标签: r dataframe


    【解决方案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。您需要使用 [[&lt;- 函数,在处理字符串/向量时使用方括号 - 例如 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)
    

    【讨论】:

    • 如果数据帧的观测值为零,则它不起作用,例如 ddf=data.frame(a=character()), ddf[xx]
    • @Luke - 有趣,尽管尝试将长度为 1 的值添加到 0 行数据集似乎并不正确。这应该工作:ddf[xx] &lt;- list(character())
    • 有趣的是,如果数据框确实有观察结果,使用 list() 的赋值也有效。所以我会说这是一般的方式,在某些情况下你可以使用 NA 的赋值。
    • 一般来说,如果你想用 NA call list(character()) 填充新列,如果你想用空字符串 call list(character(nrow(df)) 填充新列)),如果你想用一些值来初始化它们 list(rep('hello',nrow(df)))。
    • @Luke - 分配list(NA) 而不仅仅是NA 应该总是可以的,因为data.frames 无论如何都是lists。您不必重复初始值 nrow(ddf) 次,因为 R 应该回收并处理该部分。我真的很惊讶list(character(0)) 以类似的方式填充NAs。我猜你每天都会学到一些新东西。
    【解决方案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
    

    【讨论】:

    • 嗯,这很漂亮,不是吗?
    • @thelatemail: ddf[xx] 有效,但如何?我尝试了 ddf$xx 和 ddf$(xx) 但它们不起作用。另外为什么 ddf[xx] 中的 xx 被视为列而不是行?请给出答案,因为在 cmets 中会很拥挤。我会接受的。
    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    相关资源
    最近更新 更多