2017-09-27 87 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