R 如何重新编码数据帧值以仅保留满足特定集合的值,将其他值替换为;其他";
我正在寻找一个简洁的解决方案,最好使用R 如何重新编码数据帧值以仅保留满足特定集合的值,将其他值替换为;其他";,r,dplyr,recode,R,Dplyr,Recode,我正在寻找一个简洁的解决方案,最好使用dplyr,来清理数据帧列中的值,这样我就可以保持它们是匹配某个集合的值,但其他不匹配的值将被重新编码为“其他” 例子 我有一个动物名字的数据框。有4个合法的动物名称,但其他行包含乱码而不是名称。我想清理一下专栏,只保留合法的动物名称:斑马,狮子,牛,或猫 资料 库(tidyverse) 图书馆(stringi) 真实的动物名称你可以保留你需要的动物原样,其余的则改为“其他动物”: 库(dplyr) 保留名称%mutate(动物=ifelse(动物%in%k
dplyr
,来清理数据帧列中的值,这样我就可以保持它们是匹配某个集合的值,但其他不匹配的值将被重新编码为“其他”
例子
我有一个动物名字的数据框。有4个合法的动物名称,但其他行包含乱码而不是名称。我想清理一下专栏,只保留合法的动物名称:斑马
,狮子
,牛
,或猫
资料
库(tidyverse)
图书馆(stringi)
真实的动物名称你可以保留你需要的动物原样,其余的则改为“其他动物”
:
库(dplyr)
保留名称%mutate(动物=ifelse(动物%in%keep_名称,动物,'Others'))
Abase
解决方案:
keep_names <- c('lion', 'zebra', 'cow', 'cat')
within(df, animals[!animals %in% keep_names] <- "other")
使用recode()
,您可以使用命名的字符向量与进行无引号拼接代码>
df %>%
mutate(animals = recode(animals, !!!set_names(keep_names), .default = "other"))
注意:set\u names(keep\u names)
相当于setNames(keep\u names,keep\u names)
我知道你最好要一个dplyr解决方案,但这里是一个data.table
解决方案(注意,我将tibble()
调用改为data.table()
):
库(stringi)
库(数据表)
真正的动物名称首先,必须指定rlang::set\u names()
,因为purrr
也有set\u names()
。第二,我最终稍微扭曲了你的解决方案来处理mutate(跨越(…)
,但原理仍然是一样的:df%>%mutate(跨越(动物,重新编码,!!!rlang::set_names(保留_names),.default=“other”)
@Emman实际上rlang::set_names
和purr::set_names
是完全一样的东西set_name
最初位于rlang
中,并且purrr
将其导入自身。在您的问题中,您已附加了tidyverse
,因此purrr
也附加了。您不需要指定rlang::set_names()
,因为将调用purr
中的set_names
。我明白了。但是,当我省略rlang::
时,我得到一个错误:set\u names(keep\u names)中的错误:1个参数传递给'names@Emman我想你已经附上了magrittr,对吗magrittr
还有一个名为set\u names
的函数,它将set\u names
从rlang
和purr
屏蔽。在这种情况下,您需要指定rlang::
或purrr::
。没错:)
library(tidyverse)
df %>%
mutate(animals = replace(animals, !animals %in% keep_names, "other"))
df %>%
mutate(animals = recode(animals, !!!set_names(keep_names), .default = "other"))
library(stringi)
library(data.table)
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 <- data.table(animals = sample(c(real_animals_names, gibberish)))
keep_names <- c("lion", "zebra", "cow", "cat")
df[!animals %in% keep_names, animals := "other"]