R数据表:通过按名称引用其他列来修改列值

时间:2019-07-12 14:45:42

标签: r data.table

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

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)]
}

2 个答案:

答案 0 :(得分:1)

如果我们需要向量化方法,请使用row/column的{​​{1}}索引

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.tableMap循环而没有for,但仍不会被向量化

数据

eval

答案 1 :(得分:1)

使用d3.selectAll(".events").on("mouseover", function(d) { d3.select("#test").html("<img src='" + d.ArtistImage + "' width='400px' height='150px'>"); }) 的选项:

data.table

输出:

DT_input[, rn := .I]
DT_input[, replace := 
    DT_input[, DT_input[.SD, on=c("rn", .BY$replace), get(.BY$replace)], .(replace)]$V1
]

它会比Akrun base R方法要慢。