我有一个数据框,其中包含多次运行实验的结果,每个实验用作一个日志,并带有自己的升序计数器。我想在下面的示例中为iteration
的每个不同值添加另一列数据框,其最大值为experiment.num
:
df <- data.frame(
iteration = rep(1:5,5),
experiment.num = c(rep(1,5),rep(2,5),rep(3,5),rep(4,5),rep(5,5)),
some.val=42,
another.val=12
)
在此示例中,额外列将如下所示(因为所有子集具有iteration
的最大值):
df$max <- rep(5,25)
我目前使用的天真解决方案是:
df$max <- sapply(df$experiment.num,function(exp.num) max(df$iteration[df$experiment.num == exp.num]))
我还使用sapply(unique(df$experiment.num), function(n) c(n,max(df$iteration[df$experiment.num==n])))
构建了另一个框架,然后我可以将其与原始框架合并,但这两种方法看起来都比必要的复杂。
experiment.num
列是一个因素,所以我想我可以利用它来避免迭代地为所有行执行这种天真的子集。
有没有更好的方法来获取data.frame
的子集的最大值列?
答案 0 :(得分:6)
使用plyr:
ddply(df, .(experiment.num), transform, max = max(iteration))
答案 1 :(得分:3)
在基础R中使用ave
:
df$i_max <- with(df, ave(iteration, experiment.num, FUN=max))
答案 2 :(得分:2)
这是基础R的一种方式:
within(df[order(df$experiment.num), ],
max <- rep(tapply(iteration, experiment.num, max),
rle(experiment.num)$lengths))
答案 3 :(得分:1)
我认为你可以使用data.table
:
install.packages("data.table")
library("data.table")
dt <- data.table(df) #make your data frame into a data table)
dt[, pgIndexBY := .BY, by = list(experiment.num)] #this will add a new column to your data table called pgIndexBY