r - 如何在 R 中的 data.table 中替换现有映射
问题描述
我有以下功能:
library(data.table)
data1 <- data.table(KEY = c("A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "D", "E"))
keyA <- c("A", "C")
keyB <- c("B", "D")
ifelse(data1$KEY %in% keyA, "Combination 1", ifelse(data1$KEY %in% keyB, "Combination 2", "Combination 3"))
但是,我想知道是否有一种更简单、更优雅的方法可以将新映射应用于旧键。在最好的情况下,我将拥有一个包含映射结构的向量,然后简单地将其应用于 data.table。
一个小提示,即使我的映射示例是两个“重新映射”,也可以有任意数量的重新映射。
谢谢你帮助我。
解决方案
当对的数量增加而不是嵌套时,使用带有 key/val 数据集的连接会更容易ifelse
keyval <- rbind(data.table(KEY = keyA, Combinations = 'Combination 1'),
data.table(KEY = keyB, Combinations = 'Combination 2'))
如果全局环境中有很多“关键”对象,我们可以将对象的值放入 a 中list
,然后stack
将其放入两列 data.frame
keyval <- setNames(stack(setNames(mget(ls(pattern = "^key")),
paste0("Combination ", 1:2))), c('KEY', 'Combinations'))
如果您手动输入映射,则此结构有效:
keymap = list(
Combination1 = c("A", "C"),
Combination2 = c("B", "D")
)
# automatically build keyval from keymap
keyval = rbindlist(
lapply(keymap, function(x) data.table(KEY = x)),
id = "Combinations"
)
# verify there are no dupes in KEY
stopifnot(!anyDuplicated(keyval, by="KEY"))
加入on
“KEY”,通过赋值( )在“data1”中创建“combin”列:=
。NA
通过将元素分配给新值“组合 3”来替换元素
data1[keyval, combin := Combinations, on = .(KEY)]
data1[is.na(combin), combin := 'Combination 3'][]
推荐阅读
- angular - 角度类属性到常量变量
- c++ - 将内容(对象)复制到 JVM 中的新堆
- ldap - 使用 LDAP 服务器注册对等和客户端证书时出错
- jquery - JQuery 根据父 div 从 div 获取左侧和顶部位置
- javascript - 使用 Object.values(map) 时,类型“ObjectConstructor”Typescript 上不存在属性“values”
- android - 谷歌播放中的应用程序上传显示错误未优化的 Apk
- javascript - 为什么orm函数的返回对象限制为100?
- c# - 拒绝取消的任务如何取消和释放资源
- javascript - 读取 Json 并将其转换为 JavaScript 的 Python 脚本
- jquery - 如何在带有 ASP.NET MVC 的 jQuery Datatable 中使用存储过程?