我需要在下面的数据集中创建一个新变量:
A X
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
i 9
j 10
如果newvar
等于2,5,7或9,则X
的值为1.否则,newvar
应为0.
代码:
dt1 <- data.table(A = letters[1:10], X = 1:10, key = "X")
numberlist <- list(2,5,7,9)
我根据帖子here尝试了以下内容:
dt1[, newvar:=.SD, .SDcols = 0][%in% numberlist, newvar:=.SD, .SDcols = 1]
dt1[, newvar:=.SD, .SDcols = 0][X %in% numberlist, newvar:=.SD, .SDcols = 1]
dt1[, newvar:=.SD, .SDcols = 0]
表示“将值0赋值给newvar作为默认选项。第二个括号[%in% numberlist, newvar:=.SD, .SDcols = 1]
表示”如果键(X)包含在数字列表中,请设置newvar
值到1。
知道它为什么不起作用?
答案 0 :(得分:3)
尝试
dt1[, newvar:=(X %in% c(2,5,7,9))+0L][]
# A X newvar
# 1: a 1 0
# 2: b 2 1
# 3: c 3 0
# 4: d 4 0
# 5: e 5 1
# 6: f 6 0
# 7: g 7 1
# 8: h 8 0
# 9: i 9 1
#10: j 10 0
或者,如果我们已经将匹配元素存储在向量
中numberlist <- c(2,5,7,9)
dt1[, newvar:=as.numeric(X %in% numberlist)]
as.numeric
是将逻辑向量强制转换为0/1
值的另一种选择。