【发布时间】:2020-09-16 08:41:42
【问题描述】:
我正在寻找一个简洁的解决方案,最好使用dplyr 来清理数据框列中的值,以便我可以保留它们是匹配某个集合的值,但其他不匹配的值将是重新编码为“其他”。
示例
我有一个带有动物名称的数据框。有 4 个合法的动物名称,但其他行包含乱码而不是名称。我想清理该列,只保留合法的动物名称:zebra、lion、cow 或 cat。
数据
library(tidyverse)
library(stringi)
real_animals_names <- sample(c("zebra", "cow", "lion", "cat"), size = 50, replace = TRUE)
gibberish <- do.call(paste0, Map(stri_rand_strings, n = 50, length=c(5, 4, 1),
pattern = c('[a-z]', '[0-9]', '[A-Z]')))
df <- tibble(animals = sample(c(animals, gibberish)))
> df
## # A tibble: 100 x 1
## animals
## <chr>
## 1 zebra
## 2 zebra
## 3 rbzal0677O
## 4 lion
## 5 cat
## 6 cfsgt0504G
## 7 cat
## 8 jhixe2566V
## 9 lion
## 10 zebra
## # ... with 90 more rows
解决问题的一种方法——我觉得这很烦人而且不简洁
使用 dplyr 1.0.2
df %>%
mutate(across(animals, recode,
"lion" = "lion",
"zebra" = "zebra",
"cow" = "cow",
"cat" = "cat",
.default = "other"))
这样就完成了,但是这段代码重复了每个动物的名字两次,我觉得它很笨重。有没有更清洁的解决方案,最好使用dplyr?
编辑下面给出的建议答案
因为我喜欢dplyr::recode 的可读性,但不喜欢每个动物的名字都重复两次;并且由于下面的答案使用%in% - 我可以将%in% 合并到我自己的recode 解决方案中以使其更简单/更简洁吗?
【问题讨论】: