使用dplyr有条件地替换列中的值

使用dplyr有条件地替换列中的值,r,dplyr,R,Dplyr,我有一个示例数据集,其中有一列的内容如下: Candy Sanitizer Candy Water Cake Candy Ice Cream Gum Candy Coffee 我想做的是将其替换为两个因素——“糖果”和“非糖果”。我可以用Python/Pandas实现这一点,但似乎无法找到基于dplyr的解决方案。谢谢大家! 假设您的数据框为dat,列为var: dat = dat %>% mutate(candy.flag = factor(ifelse(var == "Candy",

我有一个示例数据集,其中有一列的内容如下:

Candy
Sanitizer
Candy
Water
Cake
Candy
Ice Cream
Gum
Candy
Coffee

我想做的是将其替换为两个因素——“糖果”和“非糖果”。我可以用Python/Pandas实现这一点,但似乎无法找到基于dplyr的解决方案。谢谢大家!

假设您的数据框为
dat
,列为
var

dat = dat %>% mutate(candy.flag = factor(ifelse(var == "Candy", "Candy", "Non-Candy")))

不需要
dplyr
。假设
var
已存储为因子:

non_c <- setdiff(levels(dat$var), "Candy")

levels(dat$var) <- list(Candy = "Candy", "Non-Candy" = non_c)

也就是说,这要快9倍。

dplyr
tidyr

dat %>% 
    mutate(var = replace(var, var != "Candy", "Not Candy"))
明显快于
ifelse
方法。 创建初始数据帧的代码可以如下所示:

library(dplyr)
dat <- as_data_frame(c("Candy","Sanitizer","Candy","Water","Cake","Candy","Ice Cream","Gum","Candy","Coffee"))
colnames(dat) <- "var"
库(dplyr)

dat另一种使用
dplyr的解决方案
使用
case\u时

dat %>%
    mutate(var = case_when(var == 'Candy' ~ 'Candy',
                           TRUE ~ 'Non-Candy'))
时,
case\u的语法是要替换的
condition~值
。文件

可能比使用
replace
的解决方案效率更低,但优点是可以在一个命令中执行多个替换,同时仍具有良好的可读性,即替换生成三个级别:

dat %>%
    mutate(var = case_when(var == 'Candy' ~ 'Candy',
                           var == 'Water' ~ 'Water',
                           TRUE ~ 'Neither-Water-Nor-Candy'))

当您只需要两个值时,我认为一个简单的ifelse()比较合适

此外,当PhJ提出解决方案时,嵌入式iFelse可以模拟与case_相同的情况(尽管我很喜欢他的可读性)

或者也是
因子(dat$var==“Candy”,labels=c(“Non-Candy”,“Candy”))
但我认为重置级别是一个很好的方法。@RichardScriven的方法(我的评论)严格控制了这一点
dat %>%
    mutate(var = case_when(var == 'Candy' ~ 'Candy',
                           var == 'Water' ~ 'Water',
                           TRUE ~ 'Neither-Water-Nor-Candy'))
dat %>%
    mutate(
        var = ifelse(var == "Candy", "Candy", "Non-Candy")
    )