首页 > 解决方案 > R数据表:通过按名称引用其他列来修改列值

问题描述

我有一个融化的数据表,其中的一列包含引用同一表中其他列名的值。我想用引用列的行值替换同一列中的每一行。

library("data.table")

## Example input data table
DT_input <- data.table(A=c(1:10),
                       B=c(11:20),
                       C=c(21:30),
                       replace=c(rep("A", 5), rep("B", 3), rep("C", 2)))

## Desired output data table
DT_output <- data.table(A=c(1:10),
                        B=c(11:20),
                        C=c(21:30),
                        replace=c(1:5, 16:18, 29:30))

由于 for 循环,此处显示的旧方法非常慢:

## Attempted looping solution
for (kRow in seq_len(nrow(DT_input))) {
    e <- parse(text = DT_input[kRow, Variable])
    DT_input[kRow, Variable := eval(e)]
}

标签: rdata.table

解决方案


如果我们需要矢量化方法,请使用row/column索引base R

i1 <- cbind(seq_len(nrow(df1)), match(df1$replace, names(df1)[-4]))
df1$replace <- df1[-4][i1]
df1$replace
#[1]  1  2  3  4  5 16 17 18 29 30

使用data.table, 选项是Mapfor没有 的循环eval,但它仍然不会被矢量化

数据

df1 <- as.data.frame(DT_input)

推荐阅读