r - data.table 按名称引用另一个 data.table 中的列

标签 r data.table

我有以下数据表:

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))

现在,我想根据 ComparisonDT 中的列的比较添加一个新列。以下命令生成预期的输出:

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.

在我看来,该操作并未对 ComparisonDTA 列的元素进行向量化,而且我真的不知道理解为什么,因为 C 列的元素被正确获取(即它单独使用 C 的元素,但不使用 A 的元素) 。我怎样才能进行这种比较?

任何帮助将不胜感激。

最佳答案

我们可以将 joinon 结合使用

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/

相关文章:

c++ - 是否可以列出所有可以通过 `.Call()` 加载的可用名称? .Call ("function"错误)

r - R acf 计算中的明显错误

r - 在 data.table 中使用 eval

r - 获取某列对于另一列的不同类别不适用的行数

r - 根据 data.table 中特定列的多个条件标记行

r - 根据矩阵中列的排列,有多少行满足条件

r - 多值列的 dplyr 中的 Pivot_longer

r - 应用数据帧的多个 gsub 函数列,R

r - 在列表列中设置操作

r - 我如何融化具有连接列名称的 data.table