【问题标题】:Data Table - Select Value of Column by Name From Another Column数据表 - 按名称从另一列中选择列的值
【发布时间】:2014-01-30 19:44:57
【问题描述】:

我有一个数据表,其中包含许多包含值的列。我有另一列定义了我需要选择哪些列的值。我很难找到一种方法来做到这一点。

这是一个简单的例子。

> d <- data.table(
     value.1 = c("one", "uno", "1"),
     value.2 = c("two", "dos", "2"),
     name.of.col = c("value.1","value.2","value.1"))

> d
   value.1 value.2 name.of.col
1:     one     two     value.1
2:     uno     dos     value.2
3:       1       2     value.1

我想添加一个列“value.of.col”,其中包含“name.of.col”指定的列的值。

> d
   value.1 value.2 name.of.col  value.of.col
1:     one     two     value.1  one
2:     uno     dos     value.2  dos
3:       1       2     value.1  1

【问题讨论】:

  • 感谢到目前为止的回复。答案肯定有效,但非常占用内存。谁能想到在相当大的数据表上执行此操作的好方法?我正在使用的表是 700k 行、132 列和大约 700MB。
  • 第二种方案更快吗?

标签: r data.table


【解决方案1】:

另一种选择:

d[ , value.of.col := diag(as.matrix(.SD)), .SDcols = d[ , name.of.col]]
> d
   value.1 value.2 name.of.col value.of.col
1:     one     two     value.1          one
2:     uno     dos     value.2          dos
3:       1       2     value.1            1

EDIT添加更快的解决方案:

d[ , value.of.col :=
      melt(d,id.vars='name.of.col')[name.of.col==variable, value]]

【讨论】:

  • +1 有趣的使用列回收和诊断;你有一种非凡的数据思考方式;我从来没有想过这样做。
  • @BrodieG 谢谢。我添加了一个新的解决方案,因为 Op 发现这 2 个解决方案有点慢。
【解决方案2】:

以下内容应该是高效的,并且更易于阅读/遵循。

for (i in unique(d[["name.of.col"]]))
    d[ name.of.col==i, value.of.col:=get(i) ]

d
   value.1 value.2 name.of.col value.of.col
1:     one     two     value.1          one
2:     uno     dos     value.2          dos
3:       1       2     value.1            1

【讨论】:

    【解决方案3】:

    您可以使用矩阵索引从第一列和第二列中提取值:

    mx.idx <- d[, cbind(1:nrow(d), match(name.of.col, names(d)))]
    d[, 
      value.of.col:=
        as.matrix(d[, 1:2])[mx.idx]
     ]
    d
    #    value.1 value.2 name.of.col value.of.col
    # 1:     one     two     value.1          one
    # 2:     uno     dos     value.2          dos
    # 3:       1       2     value.1            1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 2015-03-28
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 2023-03-29
      相关资源
      最近更新 更多