【问题标题】:reshaping the data with melt function使用融化功能重塑数据
【发布时间】:2017-03-20 21:41:15
【问题描述】:

例如我有数据('anscombe.txt'):

 case x1 x2 x3 x4    y1   y2    y3    y4
 1:    1 10 10 10  8  8.04 9.14  7.46  6.58
 2:    2  8  8  8  8  6.95 8.14  6.77  5.76
 3:    3 13 13 13  8  7.58 8.74 12.74  7.71
 4:    4  9  9  9  8  8.81 8.77  7.11  8.84
 5:    5 11 11 11  8  8.33 9.26  7.81  8.47
 6:    6 14 14 14  8  9.96 8.10  8.84  7.04
 7:    7  6  6  6  8  7.24 6.13  6.08  5.25
 8:    8  4  4  4 19  4.26 3.10  5.39 12.50
 9:    9 12 12 12  8 10.84 9.13  8.15  5.56
10:   10  7  7  7  8  4.82 7.26  6.42  7.91
11:   11  5  5  5  8  5.68 4.74  5.73  6.89

我想通过以下方式重塑它们:

    x1   variable  value
 1: 10       y1  8.04
 2:  8       y1  6.95
 3: 13       y1  7.58
 4:  9       y1  8.81
 5: 11       y1  8.33
 6: 14       y1  9.96
 7:  6       y1  7.24
 8:  4       y1  4.26
 9: 12       y1 10.84
  ...         ......
34:  8       y4  6.58
35:  8       y4  5.76
36:  8       y4  7.71
37:  8       y4  8.84
38:  8       y4  8.47
39:  8       y4  7.04
40:  19      y4  5.25
41:  8       y4 12.50
42:  8       y4  5.56
43:  8       y4  7.91
44:  8       y4  6.89

所以,x1 列等于 c(x1,x2,x3,x4),值等于 c(y1,y2,y3,y4)

我如何使用 melt 功能(或 data.table 包中的一些等效功能)来做到这一点?

我试过这个:ansc_new <- melt(anscombe,id.vars = 'x1',measure.vars = c('y1','y2','y3','y4'))

但我不想看到 x1 的最后 11 个值。

【问题讨论】:

  • 必须来自data.table吗?
  • @JulianCienfuegos 理想情况下是的。但是,如果没有机会将其保留为 data.table - 其他变体也是可以接受的
  • 单独的x1 列是否有原因?根据您接下来的计划,仅使用 2 列来重塑可能更容易(也更常见),因此 x1-x4 也将位于 variable 列中。
  • 如果我理解正确,你可以指定 measure.vars 不同:melt(DT, id="case", meas=patterns("x", "y")) 你可以去掉你不想要的额外列;并且还可以使用 variable.name 来分配不同的 col 名称。

标签: r data.table


【解决方案1】:

我相信你可以使用lapplyrbindlist from data.table 得到你想要的:

l<-lapply(1:4,function(z){
  melt(anscombe,id.vars = paste0("x",z),,measure.vars = paste0("y",z))
})
rbindlist(l)

【讨论】:

    【解决方案2】:

    这是一个dplyrtidyr 解决方案,它分别收集x 和y 变量,然后将它们重新绑定在一起。我会考虑您是否需要单独的 x1 列:将 x 和 y 标签简单地收集到变量列中可能更容易。

    library(dplyr)
    library(tidyr)
    
    anscombe %>% 
      gather(variable.x, value, -y1, -y2, -y3, -y4) %>% 
      select(variable.x = value) %>% 
      bind_cols(gather(anscombe, variable, value, -x1, -x2, -x3, -x4)) %>%
      select(x1 = variable.x, variable, value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-27
      • 2012-12-19
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多