2014-01-30 64 views
3

我有一个包含多个列的数据表。我有另一列,它定义了哪些列的值需要我选择。我无法找到一种方法来做到这一点。数据表 - 从另一列按名称选择列的值

这是一个简单的例子。

> 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 
+0

感谢您的回复。答案肯定有效,但内存密集。任何人都可以想到一个很好的方法来在一个相当大的数据表上做到这一点?我正在使用的表格是700k行,132列和大约700MB。 –

+0

第二个解决方案更快吗? – agstudy

回答

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

+1有趣的使用色谱柱回收和诊断;你对数据有着非凡的思考方式;我从来没有想过要这样做。 – BrodieG

+0

@BrodieG谢谢。由于操作系统发现2种解决方案有点慢,我添加了一个新的解决方案。 – agstudy

1

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

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 
1

以下内容应该具有记忆效率并且易于阅读/遵循。

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