使用 case_when,如何改变嵌套向量的新列表列?
Using case_when, how to mutate a new list-column that nests a vector within?
我正在尝试使用 dplyr
的 case_when()
根据其他列中的条件改变新列。但是,我希望新列嵌套一个向量。
例子
考虑以下玩具数据。在此基础上,我想总结一下英国的地理版图。
library(tibble)
set.seed(1)
my_mat <- matrix(sample(c(TRUE, FALSE), size = 40, replace = TRUE), nrow = 10, ncol = 4)
colnames(my_mat) <- c("England", "Wales", "Scotland", "Northern_Ireland")
my_df <- as_tibble(my_mat)
> my_df
## # A tibble: 10 x 4
## England Wales Scotland Northern_Ireland
## <lgl> <lgl> <lgl> <lgl>
## 1 TRUE TRUE TRUE FALSE
## 2 FALSE TRUE TRUE FALSE
## 3 TRUE TRUE TRUE TRUE
## 4 TRUE TRUE TRUE FALSE
## 5 FALSE TRUE TRUE TRUE
## 6 TRUE FALSE TRUE TRUE
## 7 TRUE FALSE FALSE FALSE
## 8 TRUE FALSE TRUE TRUE
## 9 FALSE FALSE TRUE FALSE
## 10 FALSE TRUE FALSE FALSE
我想改变一个新的 collective_geo_territory
列。
- 如果
England
、Scotland
、Wales
、Northern_Ireland
都是TRUE
,那么我们就说这是United_Kingdom
。
- 否则,如果只有
England
、Scotland
、Wales
是TRUE
,那么我们就说这是Great_Britain
- 任何其他组合将简单地 return 一个包含
TRUE
. 国家名称的向量
我的尝试
到目前为止,我知道如何解决上面详述的条件 (1) 和 (2),使用以下代码
library(dplyr)
my_df %>%
mutate(collective_geo_territory = case_when(England == TRUE & Wales == TRUE & Scotland == TRUE & Northern_Ireland == TRUE ~ "United_Kingdom",
England == TRUE & Wales == TRUE & Scotland == TRUE ~ "Great_Britain"))
期望的输出
但是,我想使用 collective_geo_territory
列实现如下所示的输出:
## # A tibble: 10 x 5
## England Wales Scotland Northern_Ireland collective_geo_territory
## <lgl> <lgl> <lgl> <lgl> <list>
## 1 TRUE TRUE TRUE FALSE <chr [1]> # c("Great_Britain")
## 2 FALSE TRUE TRUE FALSE <chr [2]> # c("Wales", "Scotland")
## 3 TRUE TRUE TRUE TRUE <chr [1]> # c("United_Kingdom")
## 4 TRUE TRUE TRUE FALSE <chr [1]> # c("Great_Britain")
## 5 FALSE TRUE TRUE TRUE <chr [3]> # c("Wales", "Scotland", "Northern_Ireland")
## 6 TRUE FALSE TRUE TRUE <chr [3]> # c("England", "Scotland", "Northern_Ireland")
## 7 TRUE FALSE FALSE FALSE <chr [1]> # c("England")
## 8 TRUE FALSE TRUE TRUE <chr [3]> # c("England", "Scotland", "Northern_Ireland")
## 9 FALSE FALSE TRUE FALSE <chr [1]> # c("Scotland")
## 10 FALSE TRUE FALSE FALSE <chr [1]> # c("Wales")
这是一种方法:
library(purrr) # used for pmap
my_df %>%
mutate(collective_geo_territory = case_when(
England & Wales & Scotland & Northern_Ireland ~ list("United_Kingdom"),
England & Wales & Scotland ~ list("Great_Britain"),
TRUE ~ pmap(my_df, ~names(my_df)[c(...)]))
)
基本上,最后一行的工作原理如下:
- 左侧可以简单地为
TRUE
,因为 case_when()
在第一个相关的 TRUE
处终止。所以,只有条件 1 和条件 2 失败时,我们才会到达这条线。
- 右侧基本上表示遍历我的数据集 (
pmap
) 的行并应用以下函数:获取我的数据集 (names
) 和子集中的列的名称它们 ([]
) 仅适用于那些值为真(包含在 c()
中)
一些补充说明:
- 请注意,我还必须将前两个条件(例如
"United_Kingdom"
)的右侧幻灯片包装在 list()
中,因为 case_when()
要求结果向量的类型一致
- 我将多余的
England == TRUE
(其他国家也一样)简单地更改为 England
。由于这些列已经包含逻辑值,因此无需重新检查它们的值,这使代码更具可读性。
我正在尝试使用 dplyr
的 case_when()
根据其他列中的条件改变新列。但是,我希望新列嵌套一个向量。
例子
考虑以下玩具数据。在此基础上,我想总结一下英国的地理版图。
library(tibble)
set.seed(1)
my_mat <- matrix(sample(c(TRUE, FALSE), size = 40, replace = TRUE), nrow = 10, ncol = 4)
colnames(my_mat) <- c("England", "Wales", "Scotland", "Northern_Ireland")
my_df <- as_tibble(my_mat)
> my_df
## # A tibble: 10 x 4
## England Wales Scotland Northern_Ireland
## <lgl> <lgl> <lgl> <lgl>
## 1 TRUE TRUE TRUE FALSE
## 2 FALSE TRUE TRUE FALSE
## 3 TRUE TRUE TRUE TRUE
## 4 TRUE TRUE TRUE FALSE
## 5 FALSE TRUE TRUE TRUE
## 6 TRUE FALSE TRUE TRUE
## 7 TRUE FALSE FALSE FALSE
## 8 TRUE FALSE TRUE TRUE
## 9 FALSE FALSE TRUE FALSE
## 10 FALSE TRUE FALSE FALSE
我想改变一个新的 collective_geo_territory
列。
- 如果
England
、Scotland
、Wales
、Northern_Ireland
都是TRUE
,那么我们就说这是United_Kingdom
。 - 否则,如果只有
England
、Scotland
、Wales
是TRUE
,那么我们就说这是Great_Britain
- 任何其他组合将简单地 return 一个包含
TRUE
. 国家名称的向量
我的尝试
到目前为止,我知道如何解决上面详述的条件 (1) 和 (2),使用以下代码
library(dplyr)
my_df %>%
mutate(collective_geo_territory = case_when(England == TRUE & Wales == TRUE & Scotland == TRUE & Northern_Ireland == TRUE ~ "United_Kingdom",
England == TRUE & Wales == TRUE & Scotland == TRUE ~ "Great_Britain"))
期望的输出
但是,我想使用 collective_geo_territory
列实现如下所示的输出:
## # A tibble: 10 x 5
## England Wales Scotland Northern_Ireland collective_geo_territory
## <lgl> <lgl> <lgl> <lgl> <list>
## 1 TRUE TRUE TRUE FALSE <chr [1]> # c("Great_Britain")
## 2 FALSE TRUE TRUE FALSE <chr [2]> # c("Wales", "Scotland")
## 3 TRUE TRUE TRUE TRUE <chr [1]> # c("United_Kingdom")
## 4 TRUE TRUE TRUE FALSE <chr [1]> # c("Great_Britain")
## 5 FALSE TRUE TRUE TRUE <chr [3]> # c("Wales", "Scotland", "Northern_Ireland")
## 6 TRUE FALSE TRUE TRUE <chr [3]> # c("England", "Scotland", "Northern_Ireland")
## 7 TRUE FALSE FALSE FALSE <chr [1]> # c("England")
## 8 TRUE FALSE TRUE TRUE <chr [3]> # c("England", "Scotland", "Northern_Ireland")
## 9 FALSE FALSE TRUE FALSE <chr [1]> # c("Scotland")
## 10 FALSE TRUE FALSE FALSE <chr [1]> # c("Wales")
这是一种方法:
library(purrr) # used for pmap
my_df %>%
mutate(collective_geo_territory = case_when(
England & Wales & Scotland & Northern_Ireland ~ list("United_Kingdom"),
England & Wales & Scotland ~ list("Great_Britain"),
TRUE ~ pmap(my_df, ~names(my_df)[c(...)]))
)
基本上,最后一行的工作原理如下:
- 左侧可以简单地为
TRUE
,因为case_when()
在第一个相关的TRUE
处终止。所以,只有条件 1 和条件 2 失败时,我们才会到达这条线。 - 右侧基本上表示遍历我的数据集 (
pmap
) 的行并应用以下函数:获取我的数据集 (names
) 和子集中的列的名称它们 ([]
) 仅适用于那些值为真(包含在c()
中)
一些补充说明:
- 请注意,我还必须将前两个条件(例如
"United_Kingdom"
)的右侧幻灯片包装在list()
中,因为case_when()
要求结果向量的类型一致 - 我将多余的
England == TRUE
(其他国家也一样)简单地更改为England
。由于这些列已经包含逻辑值,因此无需重新检查它们的值,这使代码更具可读性。