用融化函数重塑数据

时间:2017-03-20 21:41:16

标签: r data.table

例如,我有数据(' 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)

我如何使用融合函数(或data.table包中的某些等效函数)执行此操作?

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

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

2 个答案:

答案 0 :(得分:0)

这是一个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)

答案 1 :(得分:0)

我相信您可以使用lapply中的rbindlistdata.table获得您想要的内容:

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