获取每行中给定值的列名称

时间:2017-02-09 11:42:32

标签: r data.table

我需要在数据表中创建一个新列,其中包含所有列名称的字符串,具体取决于每行中的值。

在下面的示例中,我只想返回列名称,其中行中的所有值都是> 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"))

2 个答案:

答案 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