R使用未知列数从长到宽重塑数据 [英] r reshape data long to wide with unknown number of columns

查看:9
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆