Select 总结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"

(我今天早些时候试图问这个问题,但后来意识到我过度简化了问题;我得到的答案是正确的,但我无法使用它们,因为我在原始问题中过度简化了问题。这是我的第二次尝试…)

我在R中有一个数据帧,看起来像:

"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 = ", ")
)