使用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")
)