我有一个样本数据集,如下所示:
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的工作,但我无法看到完成它的道路。任何帮助表示赞赏。
答案 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
元素的比率。它假设每个级别只有一个这样的值。