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

R 数据表-按名称从另一列中选择列的值,r,data.table,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.

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

下面是一个简单的例子

> 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

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

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
mx.idx另一个选项:

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
编辑添加更快的解决方案:

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

以下内容应具有内存效率,并且更易于阅读/理解

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

+1柱回收和diag的有趣用途;你对数据有着非凡的思考方式;“我从来没有想过要这样做。”布罗迪格,谢谢。我添加了一个新的解决方案,因为Op发现这两个解决方案有点慢。感谢到目前为止的回复。答案肯定有用,但记忆非常密集。有人能想出一个在相当大的数据表上实现这一点的好方法吗?我正在处理的表是700k行、132列和大约700MB。第二个解决方案是否更快?
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