我有以下数据表:
Comparison <- data.table(code = c("AAA", "BBB"),
elem1 = c(1, 2),
elem2 = c(4, 4))
DT <- data.table(A = c("AAA", "AAA", "AAA", "AAA"),
B = c("BBB", "BBB", "BBB", "BBB"),
C = c(1, 2, 3, 4))
现在,我想根据 Comparison
和 DT
中的列的比较添加一个新列。以下命令生成预期的输出:
DT[, newCol := {ifelse( abs(C - Comparison[code == "AAA", elem2]) == 0, "0", "1")}]
Output:
A B C newCol
1: AAA BBB 1 1
2: AAA BBB 2 1
3: AAA BBB 3 1
4: AAA BBB 4 0
但是,如果我不是对列 A
的列值进行硬编码,而是使用列本身:
DT[, newCol := {ifelse( abs(C - Comparison[code == A, elem2]) > 0, "0", "1")}]
它输出以下错误,我不知道如何避免:
Error in `[.data.table`(Comparison, code == A, elem2) :
RHS of == is length 4 which is not 1 or nrow (2). For robustness, no recycling is allowed (other than of length 1 RHS). Consider %in% instead.
在我看来,该操作并未对 Comparison
中 DT
的 A
列的元素进行向量化,而且我真的不知道理解为什么,因为 C
列的元素被正确获取(即它单独使用 C
的元素,但不使用 A
的元素) 。我怎样才能进行这种比较?
任何帮助将不胜感激。
最佳答案
我们可以将 join
与 on
结合使用
DT[Comparison, newCol := as.integer(C != elem2), on = c("A" = "code"), nomatch = 0]
DT
# A B C newCol
#1: AAA BBB 1 1
#2: AAA BBB 2 1
#3: AAA BBB 3 1
#4: AAA BBB 4 0
关于r - data.table 按名称引用另一个 data.table 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38993130/