本文介绍了在R中使用具有多个匹配行的重塑函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
所以我有以下数据框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"变量。这很容易通过我的"Splitstackform"包中的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也加载了plitstackShape,所以可以使用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
这篇关于在R中使用具有多个匹配行的重塑函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!