这是我正在尝试做的一个简单的例子:
iris %>%
mutate(Species2 = ifelse(Species %in% c("setosa", "virginica"), "other", as.character(Species)) %>% as.factor) %>%
str
# 'data.frame': 150 obs. of 6 variables:
# $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
# $ Species2 : Factor w/ 2 levels "Other","versicolor": 1 1 1 1 1 1 1 1 1 1 ...
Run Code Online (Sandbox Code Playgroud)
但是,如果我想进行多次合并,我最终会使用深度嵌套的ifelse语句,我试图避免这种情况.最优雅的方式是什么?优选地,我可以将溶液掺入dplyr管道中.
您可以使用match:
species.keep <- c("setosa", "virginica", "other")
iris %>% mutate(Species2 = species.keep[match(Species, species.keep, nomatch=3)])
Run Code Online (Sandbox Code Playgroud)
对于不在先前位置的任何物种,我们使用nomatch参数 tomatch映射到向量"other"的最后一个位置。species.keep请注意,这假设"other"不是一个有效的物种。您必须添加as.factor等等,但这应该达到您想要的效果。 match是R中的基线映射函数。