替换数据框中的值

时间:2018-07-09 11:18:02

标签: r regex

我想替换与特定名称格式匹配的数据框中的某些行值。

例如,在下面的数据框中,我需要将“类型”列中所有“无酒精啤酒”的所有名称都简单地写成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()函数执行此操作吗?

2 个答案:

答案 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升啤酒的啤酒,因此我将第三类简称为“啤酒”。