聚合和转换数据集

时间:2014-03-12 03:45:31

标签: r plyr

我有一个样本数据集,如下所示:

df=data.frame(iter=c(1, 1, 2, 2), exp=c("A", "B", "A", "B"), 
      val=c(2.3, 3.6, 4.0, 5.0))

表格形式为:

  iter exp val
    1   A  2.3
    1   B  3.6
    2   A  4.0
    2   B  5.0

我尝试将其转换为A组和B组,使用df$val[1]/df$val[2]df$val[3]/df$val[4]等值添加比率列,最终结果如下:

   iter ratio
   1    2.3/3.6
   2    4.0/5.0

我觉得这应该是ddply的工作,但我无法看到完成它的道路。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

试试这个:

library(plyr)
df2 <- ddply(df, .(iter), summarise, ratio=paste(val[which(exp=="A")],"/",val[which(exp=="B")],sep=""))

哪位给了我:

  iter   ratio
     1 2.3/3.6
     2     4/5

答案 1 :(得分:0)

library(data.table)
DT <- as.data.table(df)
DT[, list(ratio= val[exp=="A"] / val[exp=="B"]), by=iter]

   iter    ratio
1:    1 0.638889
2:    2 0.800000

答案 2 :(得分:0)

这是基地的解决方案。它比plyr解决方案稍微复杂一点,但也许它很有启发性。

do.call(rbind,
   by(df,
      df$iter,
      function(x) {
         with(x, 
            data.frame(
               iter=iter[1],
               ratio=val[which(exp=='A')]/val[which(exp=='B')] ## Or use paste to get a text representation of the ratio
            )
         )
      }
   )
)
## i iter    ratio
## 1    1 0.638889
## 2    2 0.800000

它将数据框by拆分为iter列,然后取A val元素与B元素的比率。它假设每个级别只有一个这样的值。