我对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的“声音”值。
我非常感谢有关如何解决这个问题的任何建议。或者,如果这个问题已经解决了,我错过了,链接也会很棒。
答案 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]])