我在使用列表列作为LHS dplyr::case_when()
的输入时遇到了问题.
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
中相同观察的值的载体中.
当我try 这个时,我得到了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
然而,我的现实世界数据有多个列表列,并且 map 方法似乎变得过于复杂.