【问题标题】:Renaming coat colors in R goes wrong with str_detect在 R 中重命名外套颜色时 str_detect 出错
【发布时间】:2021-03-15 11:56:58
【问题描述】:

我有一个包含马的数据集,并希望根据毛色对它们进行分组。在我的数据集中使用了 140 多种颜色,我想只使用几种外套颜色并将其余的分配给其他。但是对于一些马来说,毛色尚未注册,即那些是未知的。下面是新颜色应该是什么。 (为了说明问题,我有一个旧外套颜色和一个新外套颜色。但我想简单地更改外套颜色,而不是创建一个带有颜色的新列)

Horse ID Coatcolor(old) Coatcolor
1 black Black
2 bayspotted Spotted
3 chestnut Chestnut
4 grey Grey
5 cream dun Other
6 Unknown
7 blue roan Other
8 chestnutgrey Grey
9 blackspotted Spotted
10 Unknown

相反,我得到下面的数据(第二个表),其中未知和其他被切换。

Horse ID Coatcolor
1 Black
2 Spotted
3 Chestnut
4 Grey
5 Unknown
6 Other
7 Unknown
8 Grey
9 Spotted
10 Other

我使用了以下代码

mydata <- data %>%
  mutate(Coatcolor = case_when(
     str_detect(Coatcolor, "spotted") ~ "Spotted",
     str_detect(Coatcolor, "grey") ~ "Grey",
     str_detect(Coatcolor, "chestnut") ~ "Chestnut",
     str_detect(Coatcolor, "black") ~ "Black",
     str_detect(Coatcolor, "") ~ "Unknown",
     TRUE ~ Coatcolor
  ))
mydata$Coatcolor[!mydata$Coatcolor %in% c("Spotted", "Grey", "Chestnut", "Black", "Unknown")] <- "Other"

那么我做错了什么/错过了什么?提前致谢。

【问题讨论】:

    标签: r dplyr case-when


    【解决方案1】:

    您可以使用dplyr 包的recode 函数。假设缺少的点是 NA 的,然后您可以随后使用 tidyr 包的 replace_na 将所有 NA 设置为“其他”。这取决于您丢失数据点的格式。

    mydata <- tibble(
      id = 1:10,
      coatcol = letters[1:10]
    ) 
    
    mydata$coatcol[5] <- NA
    mydata$coatcol[4] <- ""
    
    mydata <- mydata %>%
      mutate_all(list(~na_if(.,""))) %>% # convert empty string to NA
      mutate(Coatcolor_old = replace_na(coatcol, "Unknown")) %>% #set all NA to Unknown
      mutate(Coatcolor_new = recode(
        Coatcolor_old,
        'spotted'= 'Spotted',
        'bayspotted' = 'Spotted',
        'old_name' = 'new_name',
        'a' = 'A', #etc.
      ))
    mydata    
    

    【讨论】:

    • 缺失的点不是 NA,它们只是空的(可能是其中的一个空格)。 coatcolor 是类字符顺便说一句
    猜你喜欢
    • 2023-03-28
    • 2017-06-13
    • 2020-10-09
    • 1970-01-01
    • 2011-04-29
    • 2021-03-08
    • 1970-01-01
    • 2022-11-17
    • 2015-10-19
    相关资源
    最近更新 更多