2014-01-30 65 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