我想在数据表中创建一个新变量,其值取决于数据表的其他变量的关系。我们假设我有一个包含三个变量的数据表:
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)]
它应该与添加的不同性质和载体的比较有关。什么是解决这个问题的正确方法?
答案 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的竞争者,所以我们可以将它与总和进行比较。