在具有多个匹配行的 R 中使用重塑函数
Using the reshape function in R with multiple matching rows
所以我有以下数据框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
...
我想要
的最终输出
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
...
我想将所有不同的 ID 转换为包含原始数据框中的值的单独列。我目前正在做的是
reshape(df, idvar=c("X", "Y", "Z"), timevar="ID", direction="wide")
。但是,这会导致 a
b
和 c
中的每一个都有多行匹配的警告,因此只采用第一行。我想要每个独特的 X
、Y
、Z
组合一行,但由于有很多重复测量,我也想为每个组合设置多行,但重复测量的次数因每个 a
、b
和 c
。有什么办法可以有效地做到这一点?
您已经确定了问题的答案:您需要添加一个辅助 "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
所以我有以下数据框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
...
我想要
的最终输出 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
...
我想将所有不同的 ID 转换为包含原始数据框中的值的单独列。我目前正在做的是
reshape(df, idvar=c("X", "Y", "Z"), timevar="ID", direction="wide")
。但是,这会导致 a
b
和 c
中的每一个都有多行匹配的警告,因此只采用第一行。我想要每个独特的 X
、Y
、Z
组合一行,但由于有很多重复测量,我也想为每个组合设置多行,但重复测量的次数因每个 a
、b
和 c
。有什么办法可以有效地做到这一点?
您已经确定了问题的答案:您需要添加一个辅助 "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