我需要在数据表中创建一个新列,其中包含所有列名称的字符串,具体取决于每行中的值。
在下面的示例中,我只想返回列名称,其中行中的所有值都是> 1但这可能会改变。列名称将用作回归模型中的公式。
原因是我想为每个组建立一个模型,但在每个组中,一些变量的方差为零。有些也是分类/因子,但只有1级,所以我可以根据列名从模型中排除这些变量。
示例数据表,其结果列是必需的输出。
dt <- data.table(dept = c("a", "b", "c", "d", "e"),
x1 = c(1,2,3,4,5),
x2 = c(5,4,3,2,1),
Result = c("x1", "x1 + x2", "x1 + x2", "x1 + x2", "x2"))
答案 0 :(得分:3)
我认为这是set
函数的一个很好的用例,以避免按行操作。这看起来像很多代码,但这对于大数据集来说应该是有效的
## Create an empty "Res" column
set(dt, j = "Res", value = "")
## Loop though c("x1", "x2") columns and update the "Res" column
for (j in c("x1", "x2")) {
indx <- which(dt[[j]] > 1)
set(dt, i = indx, j = "Res", value = paste(dt[["Res"]][indx], j, sep = " + "))
}
## Get rid of leading `+`
set(dt, j = "Res", value = sub(" + ", "", dt[["Res"]], fixed = TRUE))
dt
# dept x1 x2 Result Res
# 1: a 1 5 x1 x2
# 2: b 2 4 x1 + x2 x1 + x2
# 3: c 3 3 x1 + x2 x1 + x2
# 4: d 4 2 x1 + x2 x1 + x2
# 5: e 5 1 x2 x1
答案 1 :(得分:1)
library(data.table)
dt[, new_col := paste0(colnames(.SD)[.SD>1], collapse = "+"), 1:nrow(dt), .SDcols = c("x1", "x2")]
#dt
# dept x1 x2 Result new_col
#1: a 1 5 x1 x2
#2: b 2 4 x1 + x2 x1+x2
#3: c 3 3 x1 + x2 x1+x2
#4: d 4 2 x1 + x2 x1+x2
#5: e 5 1 x2 x1