对于R上的以下数据帧类型,按列值聚合行(和)的最简单方法是什么?
当我尝试获得此形状时,我尝试将索引和组_保存在聚合中,但未成功:对于R上的以下数据帧类型,按列值聚合行(和)的最简单方法是什么?,r,dataframe,group-by,aggregate,summarize,R,Dataframe,Group By,Aggregate,Summarize,当我尝试获得此形状时,我尝试将索引和组_保存在聚合中,但未成功: index type.x type.y col3 col4 1 a m 20 25 2 b m 30 28 3 a m 15 555 3 a n 20 555 4 a m 666 1
index type.x type.y col3 col4
1 a m 20 25
2 b m 30 28
3 a m 15 555
3 a n 20 555
4 a m 666 10
4 b m 666 20
如果第1个元素相似,我假设您需要第1个元素,否则
和
index col3 col4
1 20 25
2 30 28
3 35 555
4 666 30
库(dplyr)
df%>%
分组依据(指数)%>%
#n_distinct=长度(唯一)
#或者使用@Thomas的想法列表(~sum(unique(.),na.rm=TRUE))
总结(变量(col3,col4),列表(~if_else(n_distinct(.)==1,[1],sum(,na.rm=TRUE)))
#一个tibble:4x3
索引col3 col4
1 1 20 25
2 2 30 28
3 3 35 555
4 4 666 30
仅假设与a.Suliman的dplyr答案中的假设类似(假设您想要汇总唯一值),我建议使用data.table:
library(dplyr)
df %>%
group_by(index) %>%
#n_distinct = length(unique)
#Or using @Thomas's idea list(~sum(unique(.), na.rm = TRUE))
summarise_at(vars(col3,col4), list(~if_else(n_distinct(.)==1, .[1], sum(., na.rm=TRUE))))
# A tibble: 4 x 3
index col3 col4
<int> <int> <int>
1 1 20 25
2 2 30 28
3 3 35 555
4 4 666 30
库(data.table)
my_agg_函数如果您使用的是base R
,以下代码可能会有所帮助
library(data.table)
my_agg_function <- function(x) {
x <- unique(x)
return(sum(x))
}
df[,.(col3=my_agg_function(col3),col4=my_agg_function(col4)),by=index]
我们也可以使用
> r
index col3 col4
1 1 20 25
2 2 30 28
3 3 35 555
4 4 666 30
你试过使用merge命令了吗?你能准确地定义你想要的聚合类型吗,因为现在我们只能猜测你什么时候对值进行汇总,什么时候不进行汇总。对不起,我编辑了以添加缺少的信息。我想如果col3包含一个额外的行,例如index=4和col3=1,你的代码就会中断,然后你将总结这两个666。(但是,不清楚需要哪种聚合)@Volokh请使用dput
提供此场景。感谢这样:df问题只是索引重复,这是因为在其他列中,同一个索引的值不同,我没有想出一个简单的方法。你的意思是有一个最快或最简单的方法来使用另一个包吗?非常感谢Thomas,这是一个很好的方法。@OrlandoStivenJaramilloPiza我不知道base R
是否比其他软件包更有效,因为aggregate
足够强大,可以解决这个问题,所以我认为不需要使用其他软件包中的函数。好的,我可以问一下“函数(v)和(唯一(v)”是如何实现的吗有效吗?我认为这是一个匿名函数,但我不太清楚它如何与聚合部分的“unique”函数一起工作。我将阅读您的所有文档。再次感谢。@OrlandoStivenJaramilloPizasum(unique(v))
的工作原理是这样的:对于每个分组的值,它会删除重复的值,然后进行汇总。是否有任何书籍或文档可以让我学会以这种“函数(v)汇总(唯一(v)”的方式执行不同的函数?感谢第1000次!
> r
index col3 col4
1 1 20 25
2 2 30 28
3 3 35 555
4 4 666 30
library(dplyr)
df %>%
group_by(index) %>%
summarise_at(vars(starts_with('col')), ~ sum(unique(.x)))