【问题标题】:Specifying column names from a list in the data.frame command从 data.frame 命令的列表中指定列名
【发布时间】:2010-04-28 16:20:39
【问题描述】:

我有一个名为 cols 的列表,其中包含列名:

cols <- c('Column1','Column2','Column3')

我想重现此命令,但需要调用列表:

data.frame(Column1=rnorm(10))

当我尝试时会发生以下情况:

> data.frame(cols[1]=rnorm(10))

Error: unexpected '=' in "data.frame(I(cols[1])="

如果我将cols[1] 包裹在I()eval() 中,也会发生同样的事情。

如何将向量中的项目输入data.frame() 命令?

更新:

对于某些背景,我定义了一个函数calc.means(),它接受一个数据框和一个变量列表,并执行一个大而复杂的 ddply 操作,在变量指定的级别进行汇总。

我尝试使用data.frame() 命令执行的操作是将聚合级别返回到最顶层,在每一步重新运行calc.means(),并使用rbind() 将结果相互粘合。我需要添加具有“全部”值的虚拟列,以使 rbind 正常工作。

基本上,我将cast-like 边距功能滚动到 ddply 中,并且我不想为每次运行重新键入列名。完整代码如下:

cols <- c('Col1','Col2','Col3')
rbind ( calc.means(dat,cols),
    data.frame(cols[1]='All', calc.means(dat, cols[2:3])),
    data.frame(cols[1]='All', cols[2]='All', calc.means(dat, cols[3]))
)

【问题讨论】:

    标签: r dataframe plyr


    【解决方案1】:

    使用可以使用structure:

    cols <- c("a","b")
    
    foo <- structure(list(c(1, 2 ), c(3, 3)), .Names = cols, row.names = c(NA, -2L), class = "data.frame")
    

    我不明白你为什么要这样做!

    【讨论】:

      【解决方案2】:

      我不确定如何直接执行此操作,但您可以直接跳过在 data.frame() 命令中分配名称的步骤。假设您将 data.frame() 的结果存储在名为 foo 的变量中,您可以简单地执行以下操作:

      名称(foo)

      数据框创建后

      【讨论】:

      • 是的,这通常可以工作,但data.frame() 发生在rbind() 中。不过,谢谢。
      • 您可以在一个子句中创建数据框、分配列名,然后重新绑定它们。
      • Shane,这将如何运作?我不确定如何在单个子句中通过进程传递对象。
      【解决方案3】:

      有一个技巧。你可能会弄乱列表:

      cols_dummy <- setNames(rep(list("All"), 3), cols)
      

      然后,如果您使用带有 one 括号的调用列表,那么您应该得到您想要的

      data.frame(cols_dummy[1], calc.means(dat, cols[2:3]))
      

      您可以将它作为setNames(list("All"), cols[1]) 即时使用,但我认为它不那么优雅。

      例子:

      some_names <- list(name_A="Dummy 1", name_B="Dummy 2") # equivalent of cols_dummy from above
      data.frame(var1=rnorm(3), some_names[1])
      #        var1  name_A
      # 1 -1.940169 Dummy 1
      # 2 -0.787107 Dummy 1
      # 3 -0.235160 Dummy 1
      

      【讨论】:

        【解决方案4】:

        我相信 assign() 函数就是你的答案:

        cols <- c('Col1','Col2','Col3')
        data.frame(assign(cols[1], rnorm(10)))
        

        返回:

           assign.cols.1...rnorm.10..
        1                 -0.02056822
        2                 -0.03675639
        3                  1.06249599
        4                  0.41763399
        5                  0.38873118
        6                  1.01779018
        7                  1.01379963
        8                  1.86119518
        9                  0.35760039
        10                 1.14742560
        

        使用 lapply() 或 sapply() 函数,您应该能够循环 cbind() 过程。比如:

        operation <- sapply(cols, function(x) data.frame(assign(x, rnorm(10))))
        final     <- data.frame(lapply(operation, cbind))
        

        返回:

           Col1.assign.x..rnorm.10.. Col2.assign.x..rnorm.10.. Col3.assign.x..rnorm.10..
        1                0.001962187                -0.3561499               -0.22783816
        2               -0.706804781                -0.4452781               -1.09950505
        3               -0.604417525                -0.8425018               -0.73287079
        4               -1.287038060                 0.2545236               -1.18795684
        5                0.232084366                -1.0831463                0.40799046
        6               -0.148594144                 0.4963714               -1.34938144
        7                0.442054119                 0.2856748                0.05933736
        8                0.984615916                -0.0795147               -1.91165189
        9                1.222310749                -0.1743313                0.18256877
        10              -0.231885977                -0.2273724               -0.43247570
        

        然后,清理列名:

        colnames(final) <- cols
        

        返回:

                  Col1       Col2        Col3
        1   0.19473248  0.2864232  0.93115072
        2  -1.08473526 -1.5653469  0.09967827
        3  -1.90968422 -0.9678024 -1.02167873
        4  -1.11962371  0.4549290  0.76692067
        5  -2.13776949  3.0360777 -1.48515698
        6   0.64240694  1.3441656  0.47676056
        7  -0.53590163  1.2696336 -1.19845723
        8   0.09158526 -1.0966833  0.91856639
        9  -0.05018762  1.0472368  0.15475583
        10  0.27152070 -0.2148181 -1.00551111
        

        干杯,

        亚当

        【讨论】:

          猜你喜欢
          • 2012-05-13
          • 2015-11-10
          • 2015-12-09
          • 1970-01-01
          • 1970-01-01
          • 2020-05-22
          • 1970-01-01
          • 2023-03-07
          相关资源
          最近更新 更多