我想替换与特定名称格式匹配的数据框中的某些行值。
例如,在下面的数据框中,我需要将“类型”列中所有“无酒精啤酒”的所有名称都简单地写成Alkohol Free
,将“ 5l啤酒”简单地写成Beer 5l
< / p>
df <- data.frame(Type = c('Beer','Beer 1', 'Alkoholfree Beer', 'Beer Alkoholfree', 'Beer Alkfre', '0.33 Alko free beer', 'Beer 5l', '5l Beer', 'BeeR 5l'), total = sample(1:10, 9))
Type total
1 Beer 8
2 Beer 1 5
3 Alkoholfree Beer 10
4 Beer Alkoholfree 6
5 Beer Alkfre 4
6 0.33 Alko free beer 9
7 Beer 5l 7
8 5l Beer 2
9 BeeR 5l 3
我可以使用replace()
或which()
函数执行此操作吗?
答案 0 :(得分:1)
您能不能试着跟着让我知道。
df %>%
mutate_all(funs(gsub("Alkoholfree","Alkohol free",.))) %>%
mutate_all(funs(gsub("5l [bB]eers","Beer 5l",.)))
输出如下。
> df %>%
+ mutate_all(funs(gsub("Alkoholfree","Alkohol free",.))) %>%
+ mutate_all(funs(gsub("5l [bB]eers","Beer 5l",.)))
Type total
1 Beer 8
2 Beer 1 2
3 Alkohol free Beer 9
4 Beer Alkohol free 4
5 Beer Alkfre 6
6 0.33 Alko free beer 5
7 Beer 5l 3
8 5l Beer 7
9 BeeR 5l 10
答案 1 :(得分:0)
我不知道这是否会推广到您的较大数据集,但是您可以通过以下方式使用case_when
中的dplyr
来更改类型变量:
library(tidyverse)
df %>%
mutate(Type = case_when(str_detect(Type, "Alk") ~ "Alkohol Free",
str_detect(Type, "5l") ~ "Beer 5l",
TRUE ~ "Beer"))
Type total
1 Beer 5
2 Beer 6
3 Alkohol Free 4
4 Alkohol Free 9
5 Alkohol Free 7
6 Alkohol Free 3
7 Beer 5l 8
8 Beer 5l 1
9 Beer 5l 10
此解决方案使用str_detect
包中的stringr
来检测Type
是否包含“ Alk”(表示无酒精啤酒)或“ 5l”(表示5升啤酒)并以您想要的方式覆盖该列。您没有指定要使用那些既不含酒精又不含5升啤酒的啤酒,因此我将第三类简称为“啤酒”。