Как добавить столбец подсчета на основе условия фильтра, а не группировки в dplyr? - PullRequest
0 голосов
/ 17 мая 2018

Ниже приведено подмножество моих данных об активах

# df1 <- AllAssets %>%
#   filter(country %in% c('Morocco', 'Gabon', 'Tunisia')) %>%
#   group_by(country, named, active) %>%
#   summarize(assets = n())

Эквивалентно этому фрейму данных здесь:

library(dplyr)
library(tibble)
df1 <- structure(list(country = c("Gabon", "Gabon", "Gabon", "Morocco", 
"Morocco", "Tunisia", "Tunisia", "Tunisia"), named = c(FALSE, 
TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), active = c(1, 0, 
1, 0, 1, 0, 0, 1), assets = c(8L, 305L, 271L, 254L, 18L, 24L, 
350L, 282L)), class = "data.frame", row.names = c(NA, -8L), .Names = c("country", 
"named", "active", "assets")) %>% as.tibble() %>% group_by(country, named)

# A tibble: 8 x 4
# Groups:   country, named [5]
# country named active assets
# <chr>   <lgl>  <dbl>  <int>
# 1 Gabon   FALSE     1.      8
# 2 Gabon   TRUE      0.    305
# 3 Gabon   TRUE      1.    271
# 4 Morocco TRUE      0.    254
# 5 Morocco TRUE      1.     18
# 6 Tunisia FALSE     0.     24
# 7 Tunisia TRUE      0.    350
# 8 Tunisia TRUE      1.    282

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

df1 %>%
  mutate(ctry_namedTF_count = sum(assets)) %>% 
  group_by(country) %>% 
  mutate(ctry_count = sum(assets)) %>% 
  filter(named == TRUE, active == 1) %>% 
  select(-(named:active)) %>% 
  rename(named_active = assets, 
         TotalAssets = ctry_count,
         named = ctry_namedTF_count)

# Output:
# A tibble: 3 x 4
# Groups:   country [3]
  country named_active named TotalAssets
  <chr>          <int> <int>       <int>
1 Gabon            271   576         584
2 Morocco           18   272         272
3 Tunisia          282   632         656

Я, по сути, «свертываю» свой фрейм данных, как описано в dplyr vignette (Ctrl-F 'roll-up') с повторными вызовами sum () и многократным добавлением числа, а не просто подсчетом случаев группировки.Но то, что у меня есть, хотя и функционально, трудно прочитать, и мне интересно, есть ли более простой способ или пользовательская функция, которая имела бы больше смысла.

Например, dplyr :: add_count чрезвычайно прост в использовании длядобавьте столбец, который подсчитывает количество случаев в одном или нескольких столбцах,

> df1 %>% add_count(country, named)
# A tibble: 8 x 5
# Groups:   country, named [5]
  country named active assets     n
  <chr>   <lgl>  <dbl>  <int> <int>
1 Gabon   FALSE     1.      8     1
2 Gabon   TRUE      0.    305     2
3 Gabon   TRUE      1.    271     2
4 Morocco TRUE      0.    254     2
5 Morocco TRUE      1.     18     2
6 Tunisia FALSE     0.     24     1
7 Tunisia TRUE      0.    350     2
8 Tunisia TRUE      1.    282     2

, и мне интересно, есть ли что-то, что суммирует переменную между этими группировками.

Есть ли какая-либо функция, подобная этойсуществуют в базе R или в других пакетах мунджинга?Что-то вроде df1 %>% add_aggregate_by_vars_filters(vars = named, filter = 'named == TRUE', sum_var = assets), или что-то такое же чистое и практичное?

1 Ответ

0 голосов
/ 17 мая 2018
library(dplyr)

df1 <- structure(list(country = c("Gabon", "Gabon", "Gabon", "Morocco", 
"Morocco", "Tunisia", "Tunisia", "Tunisia"), named = c(FALSE, 
TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE), active = c(1, 0, 
1, 0, 1, 0, 0, 1), assets = c(8L, 305L, 271L, 254L, 18L, 24L, 
350L, 282L)), class = "data.frame", row.names = c(NA, -8L), .Names = c("country", 
"named", "active", "assets"))

df1 %>%
  group_by(country) %>%
  summarise(named_active = sum(assets[named==TRUE & active==1]),
            named = sum(assets[named==TRUE]),
            TotalAssets = sum(assets[active==1]))

# # A tibble: 3 x 4
#   country named_active named TotalAssets
#   <chr>          <int> <int>       <int>
# 1 Gabon            271   576         279
# 2 Morocco           18   272          18
# 3 Tunisia          282   632         282
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...