Как агрегировать по 2 уровням, сначала по счетчику, а затем по функции f (счетчик)? - PullRequest
0 голосов
/ 13 апреля 2019

В прошлом я делал подобные вещи в 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 ]

1 голос
/ 13 апреля 2019

Сначала мы можем сделать это, сгруппировав 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()))
0 голосов
/ 14 апреля 2019

Мы можем сделать это компактно с помощью 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 
...