使用列表列作为 case_when 的 LHS 的输入

问题描述 投票:0回答:2

我在使用列表列作为

dplyr::case_when()
的 LHS 输入时遇到问题。

library("dplyr")
library("tibble")
library("purrr")

# create a tibble and add a list column
tbl = tibble(a = c(1,2,3))
(b = list(c(1,7,8), c(1,7,8),c(1,2,3)))
#> [[1]]
#> [1] 1 7 8
#> 
#> [[2]]
#> [1] 1 7 8
#> 
#> [[3]]
#> [1] 1 2 3
tbl$b = b

我想要一个新列来标识

tbl$a
中的每个值是否位于列表列
tbl$b
中相同观察值的值向量中。

当我尝试这个时,我得到

c(0,0,0)
,但我期待
c(1,0,1)

tbl %>% mutate(a_in_b = case_when(a %in% b ~ 1,
                                  TRUE ~ 0))
#> # A tibble: 3 × 3
#>       a b         a_in_b
#>   <dbl> <list>     <dbl>
#> 1     1 <dbl [3]>      0
#> 2     2 <dbl [3]>      0
#> 3     3 <dbl [3]>      0

我不确定这是否相关,但由于我不清楚的原因,这些也给出了不同的结果:

tbl$a[1] %in% tbl$b[1] # evaluates as FALSE
tbl$a[1] %in% tbl$b[[1]] # evaluates as TRUE

我可以使用

map2()
方法,例如

map2(tbl$a, tbl$b, \(x,y) x %in% y) # this works

但是,我的现实世界数据有多个列表列,并且地图方法似乎变得过于复杂。

r dplyr
2个回答
0
投票

使用rowwise,然后就直接了。

library(dplyr)

tbl %>%
  rowwise %>%
  mutate(a_in_b = +(a %in% b)) %>%
  ungroup

给予

# A tibble: 3 × 3
      a b          a_in_b
  <dbl> <list>      <int>
1     1 <dbl [3]>       1
2     2 <dbl [3]>       0
3     3 <dbl [3]>       1

0
投票

当您加载

purrr
时,您可以使用
pmap()

purrr::pmap(tbl, \(a, b) a %in% b)
# [[1]]
# [1] TRUE

# [[2]]
# [1] FALSE

# [[3]]
# [1] TRUE
© www.soinside.com 2019 - 2024. All rights reserved.