2017-09-27 80 views
1

我有一个结构化的纯种名的数据库,如下所示:如何使用链式ifelse和grepl?

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声明,但不知道该如何处理多OCCURENCES和敏感的情况下!

+1

简单,将您输入的所有文本小写和你的模式为grepl应该是下壳的。 – amrrs

回答

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 
> 
3

如果你有兴趣在其他方法可以做到这一点,这里有一个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