Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按组计算汇总并将值带回数据帧 df_R - Fatal编程技术网

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)