如何在2个级别上进行汇总,首先是按计数,其次是函数f(count)?

时间:2019-04-13 10:13:16

标签: r aggregation

过去我在SQL中做过类似的事情,但是我是R语言的新手,如果这是一个基本问题,我事先表示歉意。

我如何首先基于对1类的计数来聚合数据,然后对这些计数应用函数以再次对其进行聚合?

可以说我的数据是:

df<-data.frame(ID1=c(1,1,1,1,1,2,2,2,2,3,3,3,3,3), 
ID2=c(201,201,203,203,204,201,202,204,204,201,203,203,204,203))

首先,我将按计数汇总ID2,以获得一个看起来像这样的数据框:

df2<-data.frame(ID1=c(1,1,1,2,2,2,3,3,3), 
ID2=c(201,203,204,201,202,204,201,203,204), 
counts=c(2,2,1,1,1,2,1,3,1))

此后,我将一个函数应用于ID1上的聚合(它基本上是计数的分数的乘积。因此,对于ID = 1,它将是(2/5)*(2/5)*(1 / 5),对于ID = 2,它将是(1/4)*(1/4)*(2/4),依此类推,因此最终数据帧如下所示:

df3<-data.frame(ID1=c(1,2,3), f=c(0.032, 0.03125, 0.024))

如何进行多次聚合,以及如何使用类似SQL的函数进行聚合?

2 个答案:

答案 0 :(得分:1)

我们可以先对ID1ID2进行分组,计算行数,然后对group_by ID1进行计算。

library(dplyr)

df %>%
  group_by(ID1, ID2) %>%
  summarise(count = n()) %>%
  ungroup() %>%
  group_by(ID1) %>%
  summarise(f = prod(count)/(sum(count) ^ n()))

答案 1 :(得分:0)

我们可以使用table

library(dplyr)
df %>% 
  group_by(ID1) %>% 
  summarise(n = {tbl <- table(ID2); prod(tbl)/(sum(tbl)^length(tbl))})
# A tibble: 3 x 2
#    ID1      n
#  <dbl>  <dbl>
#1     1 0.032 
#2     2 0.0312
#3     3 0.024 

另一个选择是

library(matrixStats)
tbl <- table(df)
rowProds(na_if(tbl, 0), na.rm = TRUE)/rowSums(tbl)^rowSums(tbl!= 0)
#    1       2       3 
# 0.03200 0.03125 0.02400