假设我有一个带有数值的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
并且我想要一个列来告诉我哪些行在列12
或a
中有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]
但是没有用。我在做什么错了?
答案 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