假设有一个data.table,如下所示:
exp <- structure(list(
id = c("a", "b"),
num = list(c(2L, 5L, 8L),
c(6L, 10L, 13L, 19L))),
.Names = c("id", "num"),
row.names = c(NA, -2L),
class = c("data.table", "data.frame"))
看到它:
exp
id num
1: a 2,5,8
2: b 6,10,13,19
结构:
str(exp)
Classes ‘data.table’ and 'data.frame': 2 obs. of 2 variables:
$ id : chr "a" "b"
$ num:List of 2
..$ : int 2 5 8
..$ : int 6 10 13 19
我的任务是创建一个新列(例如bw_1_to_5
),告诉我num
列是否包含1到5之间的任何数字。因此第一行应显示TRUE
第二行应显示FALSE
。
我尝试使用mapply
,%in%
,intersect
和any
,但无法正确使用。任何帮助将不胜感激。
答案 0 :(得分:1)
我们可以遍历list
列,检查1:5范围内是否有any
值并将:=
分配给新列
exp[, bw_1_to_5 := unlist(lapply(num, function(x) any(1:5 %in% x)))]
exp
# id num bw_1_to_5
#1: a 2,5,8 TRUE
#2: b 6,10,13,19 FALSE
如果我们使用map
中的purrr
,可以进一步简化为
library(purrr)
exp[, bw_1_to_5 := map_lgl(num, ~ any(1:5 %in% .x))]