data.frame:通过将函数应用于行组来创建列

时间:2012-06-13 14:45:20

标签: r dataframe sapply

我有一个数据框,其中包含多次运行实验的结果,每个实验用作一个日志,并带有自己的升序计数器。我想在下面的示例中为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的子集的最大值列?

4 个答案:

答案 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