r - 使用 case_when,如何改变嵌套向量的新列表列?
问题描述
我正在尝试使用dplyr
'scase_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
areTRUE
, 那么我们说这是United_Kingdom
. - 否则,如果只有
England
、Scotland
和Wales
是TRUE
,那么我们说这是Great_Britain
- 任何其他组合都会简单地返回一个带有国家名称的向量
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"
请注意,我还必须将前两个条件(例如)的右侧幻灯片包装在 a 中list()
,因为case_when()
结果向量需要一致的类型- 我将多余的
England == TRUE
(其他国家也一样)简单地更改为England
. 由于这些列已经包含逻辑值,因此无需重新检查它们的值,这使代码更具可读性。
推荐阅读
- python - 如何使用 pandas 为每个用户的选定列填充 NA 的最小值
- php - 如何将数组的多个复选框值插入数据库
- servicestack - PocoDynamo(提供的关键元素与架构不匹配)
- java - Sbt RootProject 或 ProjectRef 不下载 github 项目内容
- android - 如何使用 Glide 检测 gif 的完成情况?
- flutter - 从已知 documentID 返回单个 Firestore 字段值
- asp.net-mvc - .net核心如何在autofac中注册ihubcontext
- sql - 如何一起使用 COUNT 和 MAX 但分组?
- vuetify.js - Vuetify 阻塞 UI 几秒钟
- javascript - 如何给我的 JSON 字典一个主键,而不将它实现到我的循环中?