我有一个数据表,其中包含许多包含值的列。我有另一个列,它定义了我需要选择其中哪一列的值。我无法找到办法做到这一点。
这是一个简单的例子。
> 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 :(得分: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