R 如何在两个级别上进行聚合,第一个是通过计数,第二个是函数f(计数)?

R 如何在两个级别上进行聚合,第一个是通过计数,第二个是函数f(计数)?,r,aggregation,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)) df我们可以先将ID1和ID2分组,计算行数,然后按ID1分组并执行计算

我以前在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))

df我们可以先将
ID1
ID2
分组,计算行数,然后
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 
库(dplyr)
df%>%
分组依据(ID1)%>%

总结(n={tbl
df
的代码失败。我在ID1中错过了一个2,感谢
ungroup()
,然后再次
groupby(ID1)
?连续的
summary
调用每调用一次都会深入一个组,对吗?在这种情况下,这意味着我们可以调用summary两次,并放弃
ungroup()%>%groupby(ID1)
@atomman我不知道这一点,但你似乎是对的。
df%>%groupby(ID1,ID2)%%>%summary(count=n())%%>%summary(f=prod(count)/(sum(count)^n())
给出了相同的结果。感谢分享:)第一种方法工作得很好,我只是不理解代码本身是如何工作的。大括号是如何工作的?它们显然是允许您以这种方式工作的。我在编码方面最大的问题往往是我的代码效率有多低。@ArjunMohan在第一种方法中,我们按“ID1”分组,然后用
获得“ID2”的频率使用“tbl”(在
{}
-中提取块内的对象),进行计算。如果在末尾使用大括号,我只需确保最后一行是某个对象,而不是
名称
library(dplyr)

df %>%
  group_by(ID1, ID2) %>%
  summarise(count = n()) %>%
  ungroup() %>%
  group_by(ID1) %>%
  summarise(f = prod(count)/(sum(count) ^ n()))
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