簡體   English   中英

使用 case_when,如何改變嵌套向量的新列表列?

[英]Using case_when, how to mutate a new list-column that nests a vector within?

我正在嘗試使用dplyrcase_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列。

  1. 如果EnglandScotlandWalesNorthern_Ireland都是TRUE ,那么我們說這是United_Kingdom
  2. 否則,如果只有EnglandScotlandWalesTRUE ,那么我們說這是Great_Britain
  3. 任何其他組合只會返回一個帶有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

但是,我想實現一個 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(...)]))
    )

本質上,最后一行的工作原理如下:

  1. 左側可以簡單地為TRUE ,因為case_when()在第一個相關的TRUE處終止。 因此,只有條件 1 和 2 都失敗了,我們才會到達這條線。
  2. 右側基本上說迭代我的數據集( pmap )的行並應用以下 function:獲取我的數據集中列的名稱( names )並將它們子集( [] )僅用於那些值為 true 的那些(包含在c()中)

一些附加說明:

  1. 請注意,我還必須將前兩個條件(例如"United_Kingdom" )的右側幻燈片包裝在list()中,因為case_when()要求結果向量的類型一致
  2. 我將多余的England == TRUE (其他國家也一樣)簡單地更改為England 由於這些列已經包含邏輯值,因此無需重新檢查它們的值,這使代碼更具可讀性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM