如何在 2 个级别上进行聚合,首先是计数,其次是函数 f(count)?
How to aggregate on 2 levels, first by count and second a function f(count)?
我以前在SQL做过类似的事情,但我是R的新手,如果这是一个基础问题,我提前道歉。
我如何根据首先对 1 class 进行计数来聚合数据,然后对这些计数应用函数以再次聚合它?
假设我的数据是:
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 中那样使用一个函数进行聚合?
我们可以先对ID1
和ID2
进行分组,计算行数,然后group_by
ID1
并进行计算。
library(dplyr)
df %>%
group_by(ID1, ID2) %>%
summarise(count = n()) %>%
ungroup() %>%
group_by(ID1) %>%
summarise(f = prod(count)/(sum(count) ^ n()))
我们可以用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
我以前在SQL做过类似的事情,但我是R的新手,如果这是一个基础问题,我提前道歉。
我如何根据首先对 1 class 进行计数来聚合数据,然后对这些计数应用函数以再次聚合它?
假设我的数据是:
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 中那样使用一个函数进行聚合?
我们可以先对ID1
和ID2
进行分组,计算行数,然后group_by
ID1
并进行计算。
library(dplyr)
df %>%
group_by(ID1, ID2) %>%
summarise(count = n()) %>%
ungroup() %>%
group_by(ID1) %>%
summarise(f = prod(count)/(sum(count) ^ n()))
我们可以用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