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)
有更好的方法吗?提前致谢
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().
使用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)