如何检查data.table中列表列中的整数值是否落在指定范围内

时间:2018-03-08 12:20:13

标签: r data.table

假设有一个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%intersectany,但无法正确使用。任何帮助将不胜感激。

1 个答案:

答案 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))]