Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何重新编码数据帧值以仅保留满足特定集合的值,将其他值替换为;其他";_R_Dplyr_Recode - Fatal编程技术网

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'))

A
base
解决方案:

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"]