根据其他变量的条件在数据 table 中创建新变量

Create new variable in data table based on conditions on other variables

我想在数据 table 中创建一个新变量,其值取决于数据 table 中其他变量的关系。假设我有一个包含三个变量的数据 table:

library(data.table)
DT <- data.table(replicate(3,sample(0:2,5,replace=TRUE)))
DT
   V1 V2 V3
1:  0  2  1
2:  1  2  1
3:  2  0  1
4:  1  1  0
5:  1  0  0

我想创建一个基于以下函数的新变量:

myfun <- function(a,b,c) {
  newvar = "x"
  if (a > b + c) {
    newvar = "a"
  }
  if (b > a + c) {
    newvar = "b"
  }
  if (c > a + b) {
    newvar = "c"
  }
  return(newvar)
}

我尝试应用与加法等相同的逻辑,但这里失败了。

DT[, new_var := myfun(V1, V2, V3)]

应该与向量的加法和比较的性质不同有关。解决这个问题的正确方法是什么?

你的条件可以改写为

bigcol <- apply(2*DT > rowSums(DT),1,which)

因为a > b+c 等价于2a > a+b+c,依此类推。您的新专栏是

DT[,newcol:=
  sapply(bigcol,function(x) if(length(x)==0) 'x' else letters[x])
]

矩阵可能是存储数据的最自然方式,如果这是您要使用它做的事情的话。这里的方法在计算上可能更简单一些:

mat <- as.matrix(DT)
maxxer <- apply(mat,1,which.max)
newcol <- ifelse(
  2*mat[cbind(1:nrow(mat),maxxer)] > rowSums(mat),
  letters[maxxer],
  'x'
)

只有最大的列是替换 x 的竞争者,所以我们可以将它与总和进行比较。