使用 tidyverse 将数据拆分为列表并在每个列表中操作

Split data into lists and operate within each list using tidyverse

以下是我的数据:

structure(list(region = c("global", "global", "global", "africa", 
"africa", "africa", "asia", "asia", "asia"), disease = c("hear", 
"lung", "ear", "hear", "lung", "ear", "hear", "lung", "ear"), 
    number = c(20L, 22L, 40L, 14L, 12L, 16L, 15L, 18L, 10L)), class = "data.frame", row.names = c(NA, 
-9L))

我想获得每个地区肺部疾病数量的排名。我想要的结果应该是一个向量c(2, 3, 1) 因为肺病的数量在全球三种疾病中排名全球第二,在非洲三种疾病中排名第三,在亚洲三种疾病中排名第一。

我使用 group_split 创建了单独的列表,但我未能在每个列表中进行进一步计算。我尝试了 map 功能,但它没有用。所以我想问一下,如果我想在tidyverse生态系统中运营,我应该怎么做才能获得预期的结果?

谢谢。

如果您想return像以前的数据一样完成数据,有两种选择。

选项-1 使用 purrr::map_dfr

map_dfr((df %>% group_split(region)), ~ (as.data.frame(.) %>% mutate(rank = dense_rank(number))))

  region disease number rank
1 africa    hear     14    2
2 africa    lung     12    1
3 africa     ear     16    3
4   asia    hear     15    2
5   asia    lung     18    3
6   asia     ear     10    1
7 global    hear     20    1
8 global    lung     22    2
9 global     ear     40    3

Option-2 仅使用 dplyr

df %>% group_by(region) %>% mutate(rank = dense_rank(number))
# A tibble: 9 x 4
# Groups:   region [3]
  region disease number  rank
  <chr>  <chr>    <int> <int>
1 global hear        20     1
2 global lung        22     2
3 global ear         40     3
4 africa hear        14     2
5 africa lung        12     1
6 africa ear         16     3
7 asia   hear        15     2
8 asia   lung        18     3
9 asia   ear         10     1

现在您可以轻松过滤掉输出向量。

(df %>% group_by(region) %>% mutate(rank = dense_rank(number)))[which(df$disease == "lung"), "rank"]
# A tibble: 3 x 1
   rank
  <int>
1     2
2     1
3     3

如果您想将 mapgroup_split 一起使用,请按以下步骤操作

map_dfr((df %>% group_split(region)), ~ (as.data.frame(.) %>% mutate(rank = dense_rank(number)) %>% filter(disease == "lung") %>%
                                       select(region, rank)))

  region rank
1 africa    1
2   asia    3
3 global    2