如何在R中将多行组合成一个观察点

时间:2012-06-11 14:32:40

标签: r dataframe

我对R比较陌生,我有点想把我的数据放到合适的格式中。似乎重塑包可能对此有用,但我没有比这更进一步。

我有一个数据框,其中一列(V4)包含字符串和数字。我想通过V2和V1中给出的分组来拆分V4,并将结果作为三个单独的列附加到数据框。

编辑:由于我原来的示例数据框架没有完全捕捉到问题的复杂性,这里有一个更准确的例子:

>df <- data.frame(V1=c(rep("SN", 8),rep("JK", 4)), 
             V2=c(1,1,2,2,2,3,3,3,1,1,2,2), 
             V3=c("Picture", "Response", "Sound", "Sound", "Response", "Sound", "Sound", "Response", "Sound", "Response", "Sound", "Sound"), 
             V4=c("Photo", "100", "XYZc02i03", "XYZq02i03", 200, "ZYXc01i30", "ZYXq01i30", 100, "XYZc02i40", 200, "XYZc02i03", "XYZq02i03" ), 
             stringsAsFactors=FALSE)


>V1 V2       V3        V4
 SN  1  Picture     Photo
 SN  1 Response       100
 SN  2    Sound XYZc02i03
 SN  2    Sound XYZq02i03
 SN  2 Response       200
 SN  3    Sound ZYXc01i30
 SN  3    Sound ZYXq01i30
 SN  3 Response       100
 JK  1    Sound XYZc02i40
 JK  1 Response       200
 JK  2    Sound XYZc02i03
 JK  2    Sound XYZq02i03

我希望得到这样的东西:

   V1  V2       V3          V4        V5   V6
   SN   1  Picture       Photo        NA  100
   SN   2    Sound   XYZc02i03 XYZq02i03  200
   SN   3    Sound   ZYXc01i30 ZYXq01i30  100
   JK   1    Sound   XYZc02i40        NA  200
   JK   2    Sound   XYZc02i03 XYZq02i03   NA
编辑:我并不总是在V2中有相同数量的观测值,这意味着我想要得到的数据帧中可能存在V4,V5或V6的缺失值。

Edit2:V6应映射到“响应”V3,V4和V5的变量理想地按顺序映射V3的“声音”值。

我非常感谢有关如何解决这个问题的任何建议。或者,如果这个问题已经解决了,我错过了,链接也会很棒。

1 个答案:

答案 0 :(得分:0)

cbind的定义中不需要df。你会用这样的东西:

df <- data.frame(V1=rep("SN", 6), 
                 V2=rep(2:3, each=3), 
                 V3=c("Sound", "Sound", "Response", "Sound", "Sound", "Response"), 
                 V4=c("XYZc02i03", "XYZq02i03", 200, "ZYXc01i30", "ZYXq01i30", 100), 
                 stringsAsFactors=FALSE)

但考虑到您描述的数据框,您可以通过以下方式获得所需的结果:

max.subset.len <- 3 # or maybe max(sapply(split(df, list(df$V1, df$V2)), FUN=nrow))
fun <- function(v4) {length(v4) <- max.subset.len; v4}
agg <- aggregate(df$V4, by=list(df$V1, df$V2), FUN=fun)
results <- cbind(agg[1:2], agg[[3]])