【问题标题】:r data.table output in columnsr data.table 以列输出
【发布时间】:2020-04-13 12:25:31
【问题描述】:

我正在慢慢学习 data.table,但我很难获得所需的输出格式。

> z = data.table(X=c(1,1,1,2,2,2), Y=c("a","a","b","a","b","b"), Z=c(2,4,3,5,0,7))
> z
   X Y Z
1: 1 a 2
2: 1 a 4
3: 1 b 3
4: 2 a 5
5: 2 b 0
6: 2 b 7
> ansz <- z[, mean(Z), .(X, Y)]
> ansz
   X Y  V1
1: 1 a 3.0
2: 1 b 3.0
3: 2 a 5.0
4: 2 b 3.5

这很好,但我想通过变量 Y 将输出分成列(见下文)。我在想 lapply() 但无法弄清楚。

   X Y=a Y=b
1: 1 3.0 3.0
2: 2 5.0 3.5

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    你快到了。

    library(data.table)
    dt <- fread('X Y  V1
    1 a 3.0
    1 b 3.0
    2 a 5.0
    2 b 3.5')
    
    dcast(dt,X~Y,value.var = "V1")
    #>    X a   b
    #> 1: 1 3 3.0
    #> 2: 2 5 3.5
    

    然后你可以重命名列

    或者您可以先创建名称。

    library(data.table)
    dt <- fread('X Y  V1
    1 a 3.0
    1 b 3.0
    2 a 5.0
    2 b 3.5')
    
    
    dt[,new_names:=ifelse(Y=="a","Y=a","Y=b")]
    
    dcast(dt,X~new_names,value.var = "V1")
    #>    X Y=a Y=b
    #> 1: 1   3 3.0
    #> 2: 2   5 3.5
    

    【讨论】:

      【解决方案2】:

      将dcast()链接到你已经完成的事情:

      z[, mean(Z), .(X, Y)
        ][, dcast(.SD, X ~ paste0("y=", Y))]
      
         X y=a y=b
      1: 1   3 3.0
      2: 2   5 3.5
      

      或者直接使用dcast()和fun = mean:

      dcast(z, X ~ paste0("y=", Y), fun=mean)
      
         X y=a y=b
      1: 1   3 3.0
      2: 2   5 3.5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-01
        • 2019-10-15
        • 1970-01-01
        • 1970-01-01
        • 2015-10-06
        • 2021-09-12
        • 1970-01-01
        相关资源
        最近更新 更多