按组计算摘要并将值返回到数据框中

sea*_*eak 4 r

df <- data.frame(
id = c('A1','A2','A4','A2','A1','A4','A3','A2','A1','A3'),
value = c(4,3,1,3,4,6,6,1,8,4))
Run Code Online (Sandbox Code Playgroud)

我希望在每个id组中获得最大值.我试过跟随,但得到一个错误,说替换有4行,数据有10我理解,但不知道如何纠正

df$max.by.id <- aggregate(value ~ id, df, max)  
Run Code Online (Sandbox Code Playgroud)

这就是我最终成功地做到了这一点

max.by.id <- aggregate(value ~ id, df, max)  
names(max.by.id) <- c("id", "max")
df2 <- merge(df,max.by.id, by.x = "id", by.y = "id")
df2
#   id value max
#1  A1     4   8
#2  A1     4   8
#3  A1     8   8
#4  A2     3   3
#5  A2     3   3
#6  A2     1   3
#7  A3     6   6
#8  A3     4   6
#9  A4     1   6
#10 A4     6   6
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?提前致谢

jog*_*ogo 7

ave() 是该任务的功能:

df$max.by.id <- ave(df$value, df$id, FUN=max) 
Run Code Online (Sandbox Code Playgroud)

例:

df <- data.frame(
  id = c('A1','A2','A4','A2','A1','A4','A3','A2','A1','A3'),
  value = c(4,3,1,3,4,6,6,1,8,4))

df$max.by.id <- ave(df$value, df$id, FUN=max) 
Run Code Online (Sandbox Code Playgroud)

结果ave()与原始值向量具有相同的长度(也是分组变量的长度).结果的值相对于分组变量到达正确的位置.有关更多信息,请阅读文档ave().


Cat*_*ath 5

使用data.table,您可以通过id"内部"数据计算最大值,自动添加新计算的值(由id唯一):

library(data.table)
setDT(df)[, max.by.id := max(value), by=id]
df
#    id value max.by.id
# 1: A1     4         8
# 2: A2     3         3
# 3: A4     1         6
# 4: A2     3         3
# 5: A1     4         8
# 6: A4     6         6
# 7: A3     6         6
# 8: A2     1         3
# 9: A1     8         8
#10: A3     4         6
Run Code Online (Sandbox Code Playgroud)