在R中使用具有多个匹配行的重塑功能

时间:2015-05-08 22:17:56

标签: r reshape

所以我有以下数据框.css

df

我想要

的最终输出
       X     Y     Z     ID     value
1      0    20    135    a       20
2      0    20    135    a       30
3      0    20    135    b       40
4      20   104    20    c       10
5      20   104    20    b       15
...

我希望将所有不同的ID转换为包含原始数据框中值的各个列。我目前正在做的是 X Y Z a b c 1 0 20 135 20 40 null 2 0 20 135 30 null null 3 20 104 20 null 15 10 ... 。但是,这会导致警告:reshape(df, idvar=c("X", "Y", "Z"), timevar="ID", direction="wide") ab各有多行匹配,因此只会采用第一行。我想为每个唯一的cXY组合添加一行,但由于有许多重复测量,我希望每个组合都有多行,但重复测量的数量因每个Zab。有没有办法有效地做到这一点?

1 个答案:

答案 0 :(得分:3)

您已在问题中找到答案:您需要添加辅助" id"变量。这可以通过我的" splitstackshape"中的getanID轻松完成。包。这就是它的作用:

library(splitstackshape)
getanID(mydf, c("X", "Y", "Z", "ID"))
#     X   Y   Z ID value .id
# 1:  0  20 135  a    20   1
# 2:  0  20 135  a    30   2
# 3:  0  20 135  b    40   1
# 4: 20 104  20  c    10   1
# 5: 20 104  20  b    15   1

考虑到这一点,以下是您将如何更改当前的reshape方法:

reshape(getanID(mydf, c("X", "Y", "Z", "ID")), 
        direction = "wide", idvar = c("X", "Y", "Z", ".id"), timevar = "ID")
#     X   Y   Z .id value.a value.b value.c
# 1:  0  20 135   1      20      40      NA
# 2:  0  20 135   2      30      NA      NA
# 3: 20 104  20   1      NA      15      10

或者,因为" data.table"也加载了" splitstackshape",您可以使用dcast.data.table,如下所示:

dcast.data.table(getanID(mydf, c("X", "Y", "Z", "ID")),
                 X + Y + Z + .id ~ ID, value.var = "value")
#     X   Y   Z .id  a  b  c
# 1:  0  20 135   1 20 40 NA
# 2:  0  20 135   2 30 NA NA
# 3: 20 104  20   1 NA 15 10