R 以整洁的方式更改列中的多个值

R 以整洁的方式更改列中的多个值,r,list,dplyr,dataset,R,List,Dplyr,Dataset,如图所示,让我们使用内置mpg数据 > mpg %>% select(model) %>% unique() # model # <chr> # 1 a4 # 2 a4 quattro # 3 a6 quattro # ... 是否有一种简单的方法可以将mpg(我们的数据)中存在的$a4中的元素的所有实例更改为子列表“a4”的名称,并将$a6(以及a中可

如图所示,让我们使用内置mpg数据

> mpg %>% select(model) %>% unique()
#   model             
#   <chr>             
# 1 a4                
# 2 a4 quattro        
# 3 a6 quattro  
# ...
是否有一种简单的方法可以将mpg(我们的数据)中存在的$a4中的元素的所有实例更改为子列表“a4”的名称,并将$a6(以及a中可能更多的列表元素)的名称更改为子列表“a4”? 或者,是否有“更好”的数据结构可用于此目的

我希望这是在一个“整洁”的时尚。Purrr功能正常,但不适用于循环


提前感谢。

您可以使用
重新编码
进行精确匹配,并将一个值替换为另一个值

library(tidyverse)
mpg %>% 
   mutate(model = recode(model, 'a4 quattro' = 'a4', 'a6 quattro' = 'a6'))
也许如果你有一些像这里这样的模式,你可以使用一些正则表达式来实现所需的输出

mpg %>% 
  mutate(model = sub(' quattro', '', model))
对于有限值,您可以在以下情况下使用
case\u:

mpg %>%
  mutate(model = case_when(model %in% c("a4 quattro", "a4 model 2", "model 3") ~ 'a4', 
                           model %in% c("a6 quattro", "model k") ~'a6', 
                           TRUE ~ model))
一个更通用的解决方案是,如果您已经有了一个列表,您可以将其转换为dataframe并与原始数据连接

a <- list(a4 = c("a4 quattro", "a4 model 2", "model 3"), 
          a6 = c("a6 quattro", "model k"))

enframe(a) %>%
  unnest(value) %>%
  inner_join(mpg, by = c('value' = 'model'))
a%
unnest(值)%%>%
内部连接(mpg,by=c('value'='model'))

您可以使用
重新编码
进行精确匹配,并将一个值替换为另一个值

library(tidyverse)
mpg %>% 
   mutate(model = recode(model, 'a4 quattro' = 'a4', 'a6 quattro' = 'a6'))
也许如果你有一些像这里这样的模式,你可以使用一些正则表达式来实现所需的输出

mpg %>% 
  mutate(model = sub(' quattro', '', model))
对于有限值,您可以在以下情况下使用
case\u:

mpg %>%
  mutate(model = case_when(model %in% c("a4 quattro", "a4 model 2", "model 3") ~ 'a4', 
                           model %in% c("a6 quattro", "model k") ~'a6', 
                           TRUE ~ model))
一个更通用的解决方案是,如果您已经有了一个列表,您可以将其转换为dataframe并与原始数据连接

a <- list(a4 = c("a4 quattro", "a4 model 2", "model 3"), 
          a6 = c("a6 quattro", "model k"))

enframe(a) %>%
  unnest(value) %>%
  inner_join(mpg, by = c('value' = 'model'))
a%
unnest(值)%%>%
内部连接(mpg,by=c('value'='model'))

看看tidyfast::dt\u case\u when()。此函数的语法与dplyr::case_when()相同,但它是基于非常快的数据构建的。table::fifelse()。请查看tidyfast::dt_case_when()。此函数的语法与dplyr::case_when()相同,但它是基于非常快的数据构建的。table::fifelse()。