【问题标题】:Get the column names for given values in each row获取每行中给定值的列名
【发布时间】:2017-02-09 11:42:32
【问题描述】:

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

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

【问题讨论】:

  • apply(dt[,2:3]&gt;1,1,function(x) ifelse(length(colnames(dt)[2:3][x])&gt;1,paste0(colnames(dt)[2:3][x],collapse="+"),colnames(dt)[2:3][x]) ) 你得到[1] "x2" "x1+x2" "x1+x2" "x1+x2" "x1" ,你能确认你的预期结果吗
  • 我的数据表中的“结果”列是预期的结果。
  • 你如何解释条件 rowObs &gt;1 与结果第 1 行和第 5 行
  • 如果你只有两列,你可以做c(NA, "x1", "x2", "x1 + x2")[1 + (dt[["x1"]] &gt; 1) + 2 * (dt[["x2"]] &gt; 1)],这可能是人们可能想到的最快的解决方案(借用this

标签: r data.table


【解决方案1】:

我认为这是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

【讨论】:

  • 谢谢,我的实际数据集非常大,这是一个非常有效的解决方案。
  • 同意当大 data.tables 那么我的回答会得到回击。为这种新方法+1。我一直想知道 apply() 的 rowwise appraoch 是否有替代品。谢谢
【解决方案2】:
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

【讨论】:

  • @MidnightDataGeek 在这里您观察到最后一行的数据不正确.. 答案表明
  • 你是对的,我确实在问题中犯了一个错误。感谢您的回答,很高兴看到获得所需结果的不同方式。
  • 我喜欢你的答案是在一条线上,但我想更多地了解“设置”功能,因为它非常快。系统时间是0.02,您的回答和大卫的回答在我的实际数据集上注册了0。我从来没有出现过0 时间,所以我不确定是不是出了什么问题。
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 2014-10-04
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多