对于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”函数一起工作。我将阅读您的所有文档。再次感谢。@OrlandoStivenJaramilloPiza
sum(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)))