Получите соотношение событий по группам, учитывая состояние другого столбца

#r

Вопрос:

Я хотел бы знать долю событий по сайтам (т. Е. по группам), где «y» произошло хотя бы один раз.

Пример данных:

 site event occurrence 
A    A01   y          
A    A01   n          
A    A02   n          
A    A02   n          
A    A03   y          
B    B01   y          
B    B01   n          
B    B02   n          
B    B02   n          
 

Желаемый результат:

 site event occurrence proporition
A    A01   y          0.666
A    A01   n          0.666
A    A02   n          0.333
A    A02   n          0.333
A    A03   y          0.666
B    B01   y          0.5
B    B01   n          0.5
B    B02   n          0.5
B    B02   n          0.5
 

Так, на участке «А», а доля уникальных событий, по крайней мере, с одним случаем «У», составила 0,666.
На сайте «B», a доля уникальных событий, по крайней мере, с одним появлением «Y», составила 0,5.

Заранее благодарю вас!

Ответ №1:

С помощью data.table :

 library(data.table)

setDT(df)[, proporition:= uniqueN(event[occurrence == 'y'])/uniqueN(event), site]
df

#   site event occurrence proporition
#1:    A   A01          y   0.6666667
#2:    A   A01          n   0.6666667
#3:    A   A02          n   0.6666667
#4:    A   A02          n   0.6666667
#5:    A   A03          y   0.6666667
#6:    B   B01          y   0.5000000
#7:    B   B01          n   0.5000000
#8:    B   B02          n   0.5000000
#9:    B   B02          n   0.5000000
 

Ответ №2:

Решение для разделения-Нанесения-комбинирования базового R:

 do.call(rbind, lapply(with(df, split(df, site)),
    function(x) {
     n <- length(unique(x$event))
     occurences <- sum(ifelse(x$occurrence == "y", 1, 0))
     x$proporition <- 
       ifelse(x$occurrence == "y", (occurences / n), 1 - (occurences / n))
     x
    }
  )
)
 

Ответ №3:

 library(dplyr)
d %>%
    group_by(site) %>%
    mutate(props = n_distinct(event[occurrence == "y"])/n_distinct(event))
 

Комментарии:

1. Можете ли вы объяснить свой код, чтобы помочь вашему ответу?