过去我在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的函数进行聚合?
答案 0 :(得分:1)
我们可以先对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()))
答案 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