[英]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
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"))
但是,我想實現一個 output 的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
)的行並應用以下 function:獲取我的數據集中列的名稱( names
)並將它們子集( []
)僅用於那些值為 true 的那些(包含在c()
中)一些附加說明:
"United_Kingdom"
)的右側幻燈片包裝在list()
中,因為case_when()
要求結果向量的類型一致England == TRUE
(其他國家也一樣)簡單地更改為England
。 由於這些列已經包含邏輯值,因此無需重新檢查它們的值,這使代碼更具可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.