如何使用带有变异函数的向量中的条件?

时间:2019-06-21 02:44:29

标签: r dplyr mutate

我正在尝试使用突变函数转换变量。我正在使用带有case_when语句的mutate。

示例如下。数据与客户的偏爱(pref)有关。如果pref是1和5,我会将其转换为'extreme',如果是2和4,它将是'modest',否则(pref == 3),它将成为“无人”。

set.seed(9999)
pref<-sample(x=1:5,size=10,replace=TRUE)
df<-data.frame(pref)
df

   pref
1    5
2    1
3    1
4    4
5    3
6    5
7    5
8    1
9    5
10   1

我使用以下语句。但是,NA出现了。似乎case_when仅识别逻辑语句,而不能识别vector。但是,使用逻辑向量,代码会变得有些混乱(原始数据范围比5范围大,条件也更复杂。)如何解决此问题?

感谢您的帮助。

df<-df%>%mutate(prefcat=case_when(pref==c(1,5)~"extreme",
                                          pref==c(2,4)~"modest",
                                          pref==c(3)~"none"))
df
   pref prefcat
1    5  <NA>
2    1  <NA>
3    1 extreme
4    4  modest
5    3  none
6    5 extreme
7    5  <NA>
8    1  <NA>
9    5  <NA>
10   1  <NA>

2 个答案:

答案 0 :(得分:2)

当有多个要比较的值时,请使用%in%而不是==。另外,当TRUE中没有条件匹配时,最好使用默认值case_when并带有一些默认值。

library(dplyr)
df %>%
  mutate(prefcat = case_when(pref %in% c(1,5)~"extreme",
                             pref %in% c(2,4)~"modest",
                             pref == 3~"none", 
                             TRUE ~ NA_character_))

#   pref prefcat
#1     5 extreme
#2     1 extreme
#3     1 extreme
#4     4  modest
#5     3    none
#6     5 extreme
#7     5 extreme
#8     1 extreme
#9     5 extreme
#10    1 extreme

答案 1 :(得分:0)

我们只需在base R中使用命名向量即可完成

df$prefcat <- setNames(rep(c('extreme', 'modest', 'none'), 
       c(2, 2, 1)), c(1, 5, 2, 4, 3))[as.character(df$pref)]
df
#   pref prefcat
#1     5 extreme
#2     1 extreme
#3     1 extreme
#4     4  modest
#5     3    none
#6     5 extreme
#7     5 extreme
#8     1 extreme
#9     5 extreme
#10    1 extreme