我在使用列表列作为
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
但是,我的现实世界数据有多个列表列,并且地图方法似乎变得过于复杂。
使用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
当您加载
purrr
时,您可以使用pmap()
:
purrr::pmap(tbl, \(a, b) a %in% b)
# [[1]]
# [1] TRUE
# [[2]]
# [1] FALSE
# [[3]]
# [1] TRUE