例如,我有数据(' 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个值不希望我看到。
答案 0 :(得分:0)
这是一个dplyr
和tidyr
解决方案,它分别收集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
中的rbindlist
和data.table
获得您想要的内容:
l<-lapply(1:4,function(z){
melt(anscombe,id.vars = paste0("x",z),,measure.vars = paste0("y",z))
})
rbindlist(l)