根据其他变量的条件在数据 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 的竞争者,所以我们可以将它与总和进行比较。
我想在数据 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 的竞争者,所以我们可以将它与总和进行比较。