【问题标题】:How to use chained ifelse and grepl?如何使用链式 ifelse 和 grepl?
【发布时间】:2017-09-27 08:17:15
【问题描述】:

我有一个纯种名称数据库,其结构如下:

HorseName <- c("Grey emperor", "Smokey grey", "Gaining greys", "chestnut", "Glowing Chestnuts", "Ruby red", "My fair lady", "Man of war")
Number <- seq(1:8)
df <- data.frame(HorseName, Number)

我现在希望搜索每匹马名称中出现的颜色。具体来说,我希望选择“灰色”和“栗子”的所有实例,创建一个标识这些颜色的新列。任何其他名称都可以简单地称为“其他” 不幸的是,这些名称并不一致,包括复数形式和不同的大小写格式。我将如何在 R 中执行此操作?

我的预期输出是:

df$Type <- c("Grey", "Grey", "Grey", "Chestnut", "Chestnut", "Other", "Other", "Other")

我熟悉链式 ifelse 语句,但不确定如何处理复数出现和区分大小写!

【问题讨论】:

  • 简单地说,将所有输入文本转换为小写,并且您的 grepl 模式应该是小写。

标签: r


【解决方案1】:

如果您对其他方法感兴趣,这里有一个tidyverse 替代方案,其最终结果与@amrrs 答案相同。

library(tidyverse)
library(stringr)

df %>% 
  mutate(Type = str_extract(str_to_lower(HorseName), "grey|chestnut")) %>%
  mutate(Type = str_to_title(if_else(is.na(Type), "other", Type)))
#>           HorseName Number     Type
#> 1      Grey emperor      1     Grey
#> 2       Smokey grey      2     Grey
#> 3     Gaining greys      3     Grey
#> 4          chestnut      4 Chestnut
#> 5 Glowing Chestnuts      5 Chestnut
#> 6          Ruby red      6    Other
#> 7      My fair lady      7    Other
#> 8        Man of war      8    Other

【讨论】:

    【解决方案2】:

    在使用 grepl 进行模式匹配(使用小写模式)之前将所有输入文本 df$HorseName 转换为小写即可解决此问题。

    > df$Type <- ifelse(grepl('grey',tolower(df$HorseName)),'Grey',
    +                   ifelse(grepl('chestnut',tolower(df$HorseName)),'Chestnut',
    +                                'others'))
    > df
              HorseName Number     Type
    1      Grey emperor      1     Grey
    2       Smokey grey      2     Grey
    3     Gaining greys      3     Grey
    4          chestnut      4 Chestnut
    5 Glowing Chestnuts      5 Chestnut
    6          Ruby red      6   others
    7      My fair lady      7   others
    8        Man of war      8   others
    > 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多