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

时间:2015-02-20 15:37:41

标签: r comparison data.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)]

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

1 个答案:

答案 0 :(得分:1)

您的情况可以改写为

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

因为a&gt; 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的竞争者,所以我们可以将它与总和进行比较。