数据表 - 从另一列中按名称选择列的值

时间:2014-01-30 19:44:58

标签: r data.table

我有一个数据表,其中包含许多包含值的列。我有另一个列,它定义了我需要选择其中哪一列的值。我无法找到办法做到这一点。

这是一个简单的例子。

> 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

3 个答案:

答案 0 :(得分:4)

另一种选择:

d[,value.of.col:=diag(as.matrix(d[,d[,name.of.col],with=F]))]
> 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

编辑添加更快的解决方案:

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

答案 1 :(得分:2)

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

mx.idx <- d[, cbind(1:nrow(d), match(name.of.col, names(d)))]
d[, 
  value.of.col:=
    as.matrix(d[, 1:2, with=F])[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

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