data.table:基于其他列中值的存在的新布尔值列

时间:2020-03-19 14:29:11

标签: r data.table

假设我有一个带有数值的data.table,并且我想要一个新列,如果特定的其他列中存在某个数值,则为TRUE,如果不存在,则为FALSE没错因此,如果我有这张桌子:

    a   b   c
1   23  12  34
2   12  56  43
3   11  12  14
4   13  23  6
5   13  15  4
6   12  23  56
7   76  23  1
8   2   9   22
9   5   21  12
10  12  65  31

并且我想要一个列来告诉我哪些行在列12a中有c,即结果是

    a   b   c   ac_12
1   23  12  34  FALSE
2   12  56  43  TRUE
3   11  12  14  FALSE
4   13  23  6   FALSE
5   13  15  4   FALSE
6   12  23  56  TRUE
7   76  23  1   FALSE
8   2   9   22  FALSE
9   5   21  12  TRUE
10  12  65  31  TRUE

我尝试做类似的事情

val <- 12
cols <- c("a", "c")
dt[, ac_12 := lapply(.SD, function(x) val %in% x), .SDcols = cols]

但是没有用。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

dat[, ac_12 := rowSums(do.call(cbind, lapply(.SD, `%in%`, val))) > 0, .SDcols = cols ]
#      a  b  c ac_12
#  1: 23 12 34 FALSE
#  2: 12 56 43  TRUE
#  3: 11 12 14 FALSE
#  4: 13 23  6 FALSE
#  5: 13 15  4 FALSE
#  6: 12 23 56  TRUE
#  7: 76 23  1 FALSE
#  8:  2  9 22 FALSE
#  9:  5 21 12  TRUE
# 10: 12 65 31  TRUE

要了解发生了什么,让我们从最里面开始(硬编码用于本演练的参数):

lapply(dat[,c('a','c')], `%in%`, val)
# $a
#  [1] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE
# $c
#  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE

do.call(cbind, lapply(dat[,c('a','c')], `%in%`, val))
#           a     c
#  [1,] FALSE FALSE
#  [2,]  TRUE FALSE
#  [3,] FALSE FALSE
#  [4,] FALSE FALSE
#  [5,] FALSE FALSE
#  [6,]  TRUE FALSE
#  [7,] FALSE FALSE
#  [8,] FALSE FALSE
#  [9,] FALSE  TRUE
# [10,]  TRUE FALSE

rowSums(do.call(cbind, lapply(dat[,c('a','c')], `%in%`, val)))
#  [1] 0 1 0 0 0 1 0 0 1 1