r - 使用列表更改列 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]]]
解决方案
你真的不需要一个列表,因为命名向量就可以了。
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
推荐阅读
- typescript - 尝试为 lib 的 typescript 构建环境类型定义
- jupyter-notebook - 连接到 Jupyter notebook localhost 时出错
- python - Django:创建模型后出现NameError
- swift - Swift 4 中的 HMAC SHA256
- node.js - 使用 playStream() 时出现“文件”参数必须是非空字符串错误
- c - 如何删除双向链表中的节点
- javascript - 如何在检查报告长度之前等待经典报告区域的刷新?
- spring - 在 Spring RestTemplate 中设置授权标头
- python - geodjango 从原始 SQL 返回 geojson
- python - Visual Studio Code 停止运行 Python 脚本 - 似乎改为运行批处理文件