我确信这是微不足道的,但我找不到如何做到这一点。
我有一个数据框,其中有个人,每个人都可以有多个属性,并且每个属性都以多种方式分类。目前它是长条形的,记录看起来像这样(示意性的形式,实际上有点复杂):
IndividualID Property PropClass
1 X A
1 Y B
2 X A
3 Y B
3 W C
3 Z A
我想要的是每个单独的 ID 占一行,其中包含单独的 ID,然后是该个人在原始文件上拥有的每个属性和 PropClass 的成对列,因此在这种情况下:
IndividualID Prop1 PropClass1 Prop2 PropClass2 Prop3 PropClass3
1 X A Y B NA NA
2 X A NA NA NA NA
3 Y B W C Z A
因此,Prop 和 PropClass 变量的数量必须与原始数据集中任何 individualID 的最大行数(不大,大约 5)一样多,并且原始数据集中个体的行数少于该最大行数,对于该个人没有任何意义的额外列中包含 NA。个人的 Prop 和 PropClass 变量的顺序并不重要(尽管它也可能是长格式文件上的原始顺序)。
显然,如果对于 Prop 的每个可能值都有一对 Prop 和 propClass 列,那么很容易做到这一点(例如使用 reshape),但是 Prop 有数百个可能的值,因此文件会变得巨大且无用。我不敢相信没有一种简单的方法可以做我想做的事,但尽管在我看来是孜孜不倦的寻找,但我还没有找到它。请告诉我我是个白痴,如果是的话,我该如何治愈我的白痴。
可能有一种更有效的方法来做到这一点,但我现在想不出。对于需要转换为宽格式的两个变量,我认为您可能需要分别对它们进行转换,然后将两者合并在一起。但我很乐意被证明是错的。为此,我创建了两个新变量,它们为每个新 ID 生成一个列序列。这将使它们能够轻松地填充 NA。使用新列,可以很容易地将它们转换为正确的格式并将它们合并在一起。
library(plyr)
library(reshape2)
#Assumes your data is read into a variable named x
x <- ddply(x, "IndividualID", transform,
castPropClass = paste0("PropClass", seq(length(PropClass))),
castProp = paste0("Prop", seq(length(Property))))
#Use these two new variables to cast into wide format. Wrap in merge to join together:
merge(dcast(IndividualID ~ castPropClass, value.var = "PropClass", data = x),
dcast(IndividualID ~ castProp, value.var = "Property", data = x))
#Gives you this:
IndividualID PropClass1 PropClass2 PropClass3 Prop1 Prop2 Prop3
1 1 A B <NA> X Y <NA>
2 2 A <NA> <NA> X <NA> <NA>
3 3 B C A Y W Z
这显然没有正确的列“顺序”,但数据本身是正确的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)