Select 总结R中数据帧中的分组记录(…再次)
(我今天早些时候试图问这个问题,但后来意识到我过度简化了问题;我得到的答案是正确的,但我无法使用它们,因为我在原始问题中过度简化了问题。这是我的第二次尝试…) 我在R中有一个数据帧,看起来像:Select 总结R中数据帧中的分组记录(…再次),select,r,statistics,dataframe,Select,R,Statistics,Dataframe,(我今天早些时候试图问这个问题,但后来意识到我过度简化了问题;我得到的答案是正确的,但我无法使用它们,因为我在原始问题中过度简化了问题。这是我的第二次尝试…) 我在R中有一个数据帧,看起来像: "Timestamp", "Source", "Target", "Length", "Content" 0.1 , P1 , P2 , 5 , "ABCDE" 0.2 , P1 , P2 , 3 , "HIJ"
"Timestamp", "Source", "Target", "Length", "Content"
0.1 , P1 , P2 , 5 , "ABCDE"
0.2 , P1 , P2 , 3 , "HIJ"
0.4 , P1 , P2 , 4 , "PQRS"
0.5 , P2 , P1 , 2 , "ZY"
0.9 , P2 , P1 , 4 , "SRQP"
1.1 , P1 , P2 , 1 , "B"
1.6 , P1 , P2 , 3 , "DEF"
2.0 , P2 , P1 , 3 , "IJK"
...
我想把它转换成:
"StartTime", "EndTime", "Duration", "Source", "Target", "Length", "Content"
0.1 , 0.4 , 0.3 , P1 , P2 , 12 , "ABCDEHIJPQRS"
0.5 , 0.9 , 0.4 , P2 , P1 , 6 , "ZYSRQP"
1.1 , 1.6 , 0.5 , P1 , P2 , 4 , "BDEF"
...
尝试将其转换为英语,我想将具有相同“源”和“目标”的连续记录分组在一起,然后为每组打印一条记录,显示该组的开始时间、结束时间和持续时间(=结束时间开始时间),以及该组的长度总和,以及内容的串联(全部为字符串)在那群人中
时间偏移值将始终在整个数据帧中增加
我看过melt/recast,觉得它可以用来解决这个问题,但无法理解文档。我怀疑在R中这样做是可能的,但我真的不知道从哪里开始。在紧要关头,我可以导出数据帧并用Python来完成,但如果可能的话,我更愿意留在R中
提前感谢您提供的任何帮助尝试以下方法:
id <- as.numeric(gsub("P","",paste(df$Source,df$Target,sep="")))
df$id <- cumsum(c(TRUE,diff(id)!=0))
res <- by(df, df$id,
function(x) {
len <- nrow(x)
start <- x[1,1]
end <- x[len,1]
dur <- end - start
src <- x[1,2]
trg <- x[1,3]
len <- sum(x[,4])
cont <- paste(x[,5],collapse="")
return(c(start,end,dur,src,trg,len,cont))
}
)
do.call(rbind,res)
id坚持我(不优雅)的方式
df1这里是另一个使用plyr的解决方案:
id <- with(df1, paste(Source, Target))
df1$group <- cumsum(c(TRUE, id[-1] != id[-length(id)]))
library(plyr)
ddply(df1, c("group"), summarise,
start = min(Timestamp),
end = max(Timestamp),
content = paste(Content, collapse = ", ")
)
我喜欢这个解决方案-简单、优雅、完美。谢谢你,哈德利!
id <- with(df1, paste(Source, Target))
df1$group <- cumsum(c(TRUE, id[-1] != id[-length(id)]))
library(plyr)
ddply(df1, c("group"), summarise,
start = min(Timestamp),
end = max(Timestamp),
content = paste(Content, collapse = ", ")
)