R使用未知列数从长到宽重塑数据 [英] r reshape data long to wide with unknown number of columns
本文介绍了R使用未知列数从长到宽重塑数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我知道这很琐碎,但我找不到方法。
我有一个数据框,其中有多个个体,每个个体可以有几个属性,并且每个属性都以多种方式进行分类。目前它的形状很长,有一条记录看起来像(原理图形式,实际上有点复杂):
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变量的数量必须与原始数据集中任何个体ID的最大行数一样多(不大,约为5),并且如果个体在原始数据集中的行数少于该最大数目,则对该个体没有任何意义的额外列中有Nas。个人的Prop和PropClass变量的顺序并不重要(尽管它也可能是长格式文件上的原始顺序)。
显然,如果每个可能的Prop值都有一对Prop和PropClass列,那么很容易做到这一点(例如,使用重塑),但是有数百个可能的Prop值,因此文件会变得很大,并且没有帮助。我不敢相信,没有一种简单的方法可以做我想做的事情,但我还没有找到它,尽管在我看来,这似乎是一种刻苦的寻找。请告诉我我是个白痴,如果是的话,我该如何治愈我的愚蠢。推荐答案
可能有一种更有效的方法,但我现在想不出来。由于有两个变量需要转换为宽格式,我认为您可能需要将它们分开转换,然后将两者合并在一起。不过,我很希望被证明是错的。为此,我创建了两个新变量,它们为每个新ID生成一个列序列。这将允许用Nas轻松填充它们。使用新的列,很容易将它们转换为正确的格式并将它们合并在一起。
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
这显然没有正确的列"顺序",但数据本身是正确的。
这篇关于R使用未知列数从长到宽重塑数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文