首页 > 解决方案 > 使用列表更改列 data.table 中的值

问题描述

当对列表的查找不为空时,我想将列表用作简单的字典来更改值。我希望这会起作用,但事实并非如此;

assoc_values <- list("A" = "GROUP1", "C" = "GROUP1", "B" = "GROUP2", "D" = "GROUP3")
some_data_table[!is.null(assoc_values[[lookup_column]]), "mapped_col" := assoc_values[[lookup_column]]]

它失败并显示错误消息Error: recursive indexing failed at level 2。我尝试过其他方法,ifelse(!is.null(assoc_values[[lookup_column]]), ...)但总是失败。

下面有一个可重现的例子:

library(data.table)
assoc_values <- list("A" = "GROUP1", "C" = "GROUP1", "B" = "GROUP2", "D" = "GROUP2")
some_data_table <- data.table('col1' = seq(1, 10), 'lookup_column' = c('A', 'A', 'E', 'B', 'D', 'C', 'A', 'F', 'C', 'T'))
some_data_table[!is.null(assoc_values[[lookup_column]]), "mapped_col" := assoc_values[[lookup_column]]]

标签: rdata.table

解决方案


你真的不需要一个列表,因为命名向量就可以了。

library(data.table)
assoc_values <- c("A" = "GROUP1", "C" = "GROUP1", "B" = "GROUP2", "D" = "GROUP2")
some_data_table <- data.table(col1 = seq(1, 10), 
                              lookup_column = c('A', 'A', 'E', 'B', 'D',
                                                'C', 'A', 'F', 'C', 'T'))


some_data_table[, new_col := assoc_values[lookup_column]]
some_data_table[is.na(new_col), new_col := lookup_column]

some_data_table

#    col1 lookup_column new_col
# 1:    1             A  GROUP1
# 2:    2             A  GROUP1
# 3:    3             E       E
# 4:    4             B  GROUP2
# 5:    5             D  GROUP2
# 6:    6             C  GROUP1
# 7:    7             A  GROUP1
# 8:    8             F       F
# 9:    9             C  GROUP1
#10:   10             T       T

推荐阅读