2012-06-11 149 views
2

我对R相对来说比较陌生,在试图将我的数据转换为合适的格式时,我有些挂断了。似乎重塑包可能对此有用,但我除此之外没有更多。如何将多行合并为一个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的值。

编辑2:V6应映射到“响应”从V3,V4和V5变量理想地映射在V3的“声音”值以连续的顺序。

我会非常感谢关于如何去做这件事的任何建议。或者,如果这个问题在其他地方得到了解决,我错过了它,那么这个链接也会很棒。

+0

你的输出例如与您的输入一致。例如(例如XYZc02s03不在df中)。请提供一个有效的例子。 – digEmAll

+0

谢谢,我编辑它! – kat

+0

不,并不总是。还有“图片”和“回复”。如果没有给出响应,我也可以有2个“声音”但没有“响应”。另外,如果第二声音已被跳过,则只有一个带有“响应”的“声音”。 – kat

回答

0

您在定义df时不需要cbind。你会使用这样的:

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]]) 
+0

谢谢你,那种伎俩......然而,我有不同的行数,因为我在V2中并不总是有一个很好的三元组。我怎样才能让cbind使用不同的行数? – kat

+1

@kat:您应该编辑您的测试数据以反映问题的复杂程度。请尝试考虑“边缘”(或退化)情况。 –

+0

@kat:看我的编辑 –

相关问题