所以我有以下数据框.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")
a
和b
各有多行匹配,因此只会采用第一行。我想为每个唯一的c
,X
,Y
组合添加一行,但由于有许多重复测量,我希望每个组合都有多行,但重复测量的数量因每个Z
,a
和b
。有没有办法有效地做到这一点?
答案 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