我正在尝试使用突变函数转换变量。我正在使用带有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>
答案 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