我正在尝试将软件包hash
与dplyr
结合使用来修改表的列。
具体来说,我有一个哈希的键-值对字典,其中将要替换的列元素作为键,并希望将其替换为值。
下面是一个最小的可重现示例:
# 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
列中的值,而不是仅检查该列中的每个元素?如果是这样,我如何使其按预期工作?如果没有,那到底是怎么回事?
答案 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