grepl и group_by для суммирования в R с использованием dplyr - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть фрейм данных:

region_calls = data.frame(
  samples = c("S1", "S2", "S3", "S1", "S2", "S3"),
  CN_Region = c("A","A","A", "B", "B", "B"), 
  CN_State = c("0", "NoCall1or2", "1", "2", "NoCall1or2", "NoCall")
)

Я пытался сделать это:

region_calls %>% group_by(CN_Region) %>%
  summarise(call_rate = sum(grepl("0|NoCall_1or2|1|NoCall_2or3|2|3|NoCall_3or4|4", CN_State)/n()),
            fixed_call_rate = sum(grepl("0|1|2|3|4", CN_State)/n()))

Однако каждый регион дает одинаковые call_rate и fixed_call_rate

Ожидаемый ответ:

Expected answer

В основном я исключаю NoCall (не NoCall1or2) из числителя, но не из n() в знаменателе

Что мне не хватает? Я также пытался nrow(.) в знаменателе. Я видел несколько похожих вопросов, но они решают grepl отдельно, чем я намеревался. Любой очиститель dplyr подходов также приветствуется.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Для call_rate мы можем рассчитать соотношение значений, где у нас нет "NoCall". Нам не нужно регулярное выражение для call_rate, поскольку это точное совпадение, а не совпадение с шаблоном. Для fixed_call_rate мы используем grepl, чтобы найти соотношение значений, в которых есть только цифры. Мы добавляем для него границы слов (\\b), чтобы они соответствовали только "1", "2" et c, а не "NoCall1or2"

library(dplyr)

region_calls %>%
  group_by(CN_Region) %>%
  summarise(call_rate = mean(CN_State != "NoCall"),
            fixed_call_rate = mean(grepl('\\b\\d\\b', CN_State)))

#  CN_Region call_rate fixed_call_rate
#  <fct>         <dbl>           <dbl>
#1 A             1               0.667
#2 B             0.667           0.333
0 голосов
/ 15 апреля 2020

Мы также можем использовать data.table

library(data.table)
setDT(region_calls)[, .( call_rate = mean(CN_State != "NoCall"),
        fixed_call_rate = mean(grepl('\\b\\d\\b', CN_State))), CN_Region]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...