4

我有一个数据框,其中包含多次运行实验的结果,每个实验都用作日志,并带有自己的升序计数器。我想向数据框中添加另一列,该列对于下面示例中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列是一个因素,所以我认为我可以利用它来避免对所有行迭代地做这个幼稚的子集。

有没有更好的方法来获取 a 子集的最大值列data.frame

4

4 回答 4

6

使用 plyr:

ddply(df, .(experiment.num), transform, max = max(iteration))
于 2012-06-13T14:50:36.250 回答
3

ave在基础 R 中使用:

df$i_max <- with(df, ave(iteration, experiment.num, FUN=max))
于 2012-06-14T04:21:09.787 回答
2

这是base R中的一种方法:

within(df[order(df$experiment.num), ], 
       max <- rep(tapply(iteration, experiment.num, max), 
                  rle(experiment.num)$lengths))
于 2012-06-13T15:25:16.107 回答
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
于 2014-03-08T00:19:31.340 回答