在dplyr的mutate中使用哈希键/值对

时间:2019-09-12 11:47:25

标签: r hash dplyr

我正在尝试将软件包hashdplyr结合使用来修改表的列。

具体来说,我有一个哈希的键-值对字典,其中将要替换的列元素作为键,并希望将其替换为值。

下面是一个最小的可重现示例:

# Load packages.
pacman::p_load(dplyr, hash)

# Create tibble.
id <- c("0001", "0002", "0003", "0004", "0005", "0006")
colour <- c("blue", "green", "red", "purple", "purple", "pink")
tib <- as_tibble(cbind(id, colour))

# Create hashed dictionary.
k <- c("0005", "0006")
v <- c("0007", "0008")
dictionary <- hash(keys = k, values = v)

以下调用按预期工作:

> id[1] %in% keys(dictionary)
# [1] FALSE 

> values(dictionary, keys = "0005")[[1]]
# "0007"

但是,当我尝试将它们合并到mutate通话中时...

# Use dictionary to replace values.
tib %>%
  mutate(id = if_else(id %in% keys(dictionary), 
                      values(dictionary, keys = id)[[1]],
                      id))

引发以下错误:

Error in FUN(X[[i]], ...) : object '0001' not found

是否要立即检查条件id列中的值,而不是仅检查该列中的每个元素?如果是这样,我如何使其按预期工作?如果没有,那到底是怎么回事?

1 个答案:

答案 0 :(得分:1)

问题出在 if_else()上,它搜索id而不考虑条件,这会引发错误:

values(dictionary[id])
Error in get(k, x) : object '0001' not found

我建议使用 lapply()的另一种方法,在我看来可以提供预期的输出:

tib$id = unlist(lapply(tib['id'],FUN = function(i){if_else(tib$id == keys(dictionary), values(dictionary)[i], i)}))

结果

> tib$id = unlist(lapply(tib['id'],FUN = function(i){if_else(tib$id == keys(dictionary), values(dictionary)[i], i)}))
> tib
# A tibble: 6 x 2
  id    colour
  <chr> <chr> 
1 0001  blue  
2 0002  green 
3 0003  red   
4 0004  purple
5 0007  purple
6 0008  pink