首页 > 解决方案 > 如何在 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。

一个小提示,即使我的映射示例是两个“重新映射”,也可以有任意数量的重新映射。

谢谢你帮助我。

标签: rdata.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'][]

推荐阅读