Условный подсчет и добавление подсчета в столбец - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть следующий фрейм данных:

[]   Group  State       County     Deaths

[1]  01     Nicaragua   County A   0 
[2]  01     Nicaragua   County B   13  
[3]  01     Nicaragua   County C   0
[4]  02     Mexico      County D   0 
[5]  02     Mexico      County F   4  
[6]  02     Mexico      County E   0        

Я бы хотел считать все случаи из той же группы , где Смерть равна 0, а затем добавьте результат в качестве нового столбца.Результат в идеале должен выглядеть следующим образом:

[]   Group  State       County     Deaths  Counties.without.Deaths  

[1]  01     Nicaragua   County A   0       2
[2]  01     Nicaragua   County B   13      2
[3]  01     Nicaragua   County C   0       2
[4]  02     Mexico      County D   0       3
[5]  02     Mexico      County F   0       3  
[6]  02     Mexico      County E   0       3  

Есть ли для этого специальная функция?Я пытался использовать петли, но как новичок с треском провалился.Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019
merge(df, aggregate(Deaths ~ Group, df, FUN = function(x) sum(x == 0)), by = "Group", suffixes = c("", "counties.without"))

  Group     State   County Deaths Deathscounties.without
1     1 Nicaragua County A      0                      2
2     1 Nicaragua County B     13                      2
3     1 Nicaragua County C      0                      2
4     2    Mexico County D      0                      3
5     2    Mexico County F      0                      3
6     2    Mexico County E      0                      3

Данные :

df <- structure(list(Group = c(1L, 1L, 1L, 2L, 2L, 2L), State = c("Nicaragua", 
"Nicaragua", "Nicaragua", "Mexico", "Mexico", "Mexico"), County = c("County A", 
"County B", "County C", "County D", "County F", "County E"), 
    Deaths = c(0L, 13L, 0L, 0L, 0L, 0L)), row.names = c(NA, -6L
), class = "data.frame")
0 голосов
/ 05 февраля 2019

Что-то вроде:

library(dplyr)

df <- df %>%
  group_by(Group) %>%
  mutate(Counties.without.Deaths = sum(Deaths == 0))

Вместо sum вы также можете использовать length(Deaths[Deaths == 0]), однако это может быть немного медленнее.

Вы также можете сделать это в base без дополнительных пакетов;это будет самый быстрый вариант:

df$Counties.without.Deaths <- with(df, ave(Deaths, Group, FUN = function(x) sum(x == 0)))

Быстрый тест показывает, что опция base может быть почти в 10 раз быстрее:

Unit: microseconds
  expr      min        lq      mean    median       uq      max neval
 dplyr 1056.020 1091.3915 1267.1185 1121.2920 1318.019 2294.364   100
  base  113.771  132.9145  182.4703  149.6885  170.291 2769.136   100

Вывод для dplyr и base:

  Group     State   County Deaths Counties.without.Deaths
1     1 Nicaragua County A      0                       2
2     1 Nicaragua County B     13                       2
3     1 Nicaragua County C      0                       2
4     2    Mexico County D      0                       3
5     2    Mexico County F      0                       3
6     2    Mexico County E      0                       3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...