R 按组计算汇总并将值带回数据帧 df
更新: 如果需要保留原始R 按组计算汇总并将值带回数据帧 df,r,R,更新: 如果需要保留原始值,请使用以下代码。 tapply(df$value, df$id, max) # A1 A2 A3 A4 8 3 6 6 library(plyr) ddply(df, .(id), function(df){max(df$value)}) # id V1 # 1 A1 8 # 2 A2 3 # 3 A3 6 # 4 A4 6 library(dplyr) df %>% group_by(id) %>% arrange(desc
值,请使用以下代码。
tapply(df$value, df$id, max)
# A1 A2 A3 A4
8 3 6 6
library(plyr)
ddply(df, .(id), function(df){max(df$value)})
# id V1
# 1 A1 8
# 2 A2 3
# 3 A3 6
# 4 A4 6
library(dplyr)
df %>% group_by(id) %>% arrange(desc(value)) %>% do(head(., 1))
# Source: local data frame [4 x 2]
# Groups: id [4]
# id value
# (fctr) (dbl)
# 1 A1 8
# 2 A2 3
# 3 A3 6
# 4 A4 6
使用
data.table
,您可以通过id
“在”数据中计算最大值,自动添加新计算的值(按id唯一):
ave()
是该任务的函数:
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
df$max.by.id是否需要按id对结果data.frame进行排序?在尝试将其作为列添加到数据框之前,您应该先查看聚合(value~id,df,max)输出的对象。表达式聚合(value~id,df,max)工作正常。只是它对df中的一个新变量的赋值不起作用,这是有道理的,因为df与聚合结果(value~id,df,max)的长度不同。ave()工作得很好!谢谢你,乔戈。不仅你的解决方案有效,而且我理解我的方法出现错误的原因。因此,最终你希望通过单击投票旁边的按钮来接受这个答案(或任何其他答案)。我相信我需要至少150个声誉才能投票。我不熟悉r和堆栈溢出,到目前为止只有41个。当我获得投票权时,我最终会投票支持你的答案。您向我介绍了ave函数,它非常方便,我已经在其他上下文中使用过它。谢谢@也许是的,但对我来说并不明显。我记不清整个SO网站。我们是一个社区,应该一起工作。任何把Q认出来的人都要把它标出来。你比我多,所以你比我更了解dupe是正常的。看到你关闭复制品而不是用你的旧答案来回答它们,这会让很多人感到高兴,因为你只是为了得到更多的答复。我不会关闭这个复制品,但你针对regex解决方案的方式是不同的。在正则表达式中,即使是单个字符的问题,您也可以询问AvinashRaj。关于regex dupe,这对我来说也不明显。@akrun dupe不一定是完全相同的东西,OP可以做一些工作来适应它。我不打算就此话题展开讨论,坦西拜解释得比我好,我完全同意他的观点
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
tapply(df$value, df$id, max)
# A1 A2 A3 A4
8 3 6 6
library(plyr)
ddply(df, .(id), function(df){max(df$value)})
# id V1
# 1 A1 8
# 2 A2 3
# 3 A3 6
# 4 A4 6
library(dplyr)
df %>% group_by(id) %>% arrange(desc(value)) %>% do(head(., 1))
# Source: local data frame [4 x 2]
# Groups: id [4]
# id value
# (fctr) (dbl)
# 1 A1 8
# 2 A2 3
# 3 A3 6
# 4 A4 6
library(plyr)
ddply(df, .(id), function(df){
df$max.val = max(df$value)
return(df)
})
library(dplyr)
df %>% group_by(id) %>% mutate(max.val=max(value))
# Source: local data frame [10 x 3]
# Groups: id [4]
# id value max.val
# (fctr) (dbl) (dbl)
# 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
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
df$max.by.id <- ave(df$value, df$id, FUN=max)
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)