r 用未知的列数将数据从长到宽重新整形

标签 r reshape

我确定这是微不足道的,但我找不到如何去做。

我有一个数据框,其中有个人,每个人都可以有几个属性,每个属性都以多种方式分类。目前它是长形的,看起来像一个记录(以示意图形式,实际上它有点复杂):

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

所以必须有与原始数据集中任何个体 ID 的最大行数一样多的 Prop 和 PropClass 变量(并不大,大约 5),并且个体在原始数据集中的行数少于最大行数,对那个人没有任何意义的额外列在其中包含 NA。个人的 Prop 和 PropClass 变量的顺序无关紧要(尽管它也可能是长格式文件的原始顺序)。

显然,如果您有一对 Prop 和 propClass 列用于 Prop 的每个可能值,则很容易做到这一点(例如使用 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

这显然没有正确的列“顺序”,但数据本身是正确的。

关于r 用未知的列数将数据从长到宽重新整形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11301778/

相关文章:

r - 为什么 data.table::B[A] 和 plyr::join(A,B) 返回不同的结果?

r - 不使用 `function` 关键字定义匿名函数

R:我如何为每个级别(用于 reshape )创建一个带有订单数(按日期)的新变量。)

r - 如何操作facet_grid图的 strip 文本?

python - 如何在keras中将三维数组转换为五维数组

r - 我如何 reshape 这张 table ?

r - 如何使用带公式作为字符串的dcast.data.table

reshape 数据框中的列

r - 如何使用 R 中的 rms 包进行负二项式回归?

reshape 函数给出 "subscript out of bounds"错误