使用 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
如果您想将 map
与 group_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
以下是我的数据:
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
如果您想将 map
与 group_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