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