2015-02-07 82 views
11

在RI中想要在if語句中像下面的示例那樣在包含單詞red並設置新變量的混合$ color列中搜索任何顏色在混合數據框中以紅色顯示。R如何在if語句中使用grep

mix$newcolor <- if(grep("Red",mix$color) "red"

下面是一些示例數據爲數據幀結構:

艾莉斯藍 藍紫 暗紅色 暗紫

我收到此錯誤信息:

警告消息: In if(grepl(「deep red」,mix $ co LOR)== TRUE)「紅色」:條件具有長度> 1並且僅將使用的第一元件

我認爲grepl應該返回TRUE或FALSE布爾值,使得應該是可接受的,但是我錯過了一些東西(或很多)。

感謝您的幫助。

+3

這裏你需要矢量化的'ifelse'而不是正常的if和else。使用grepl時,您也不需要== true。 – 2015-02-07 17:05:35

+0

是的,那就像一個冠軍。我以前曾考慮過使用ifelse,但是難以置信的是其他部分,但我只是將其中的$ newcolor引用爲其他部分。它將是空的或有轉換後的值。謝謝。 – Jazzmine 2015-02-07 17:14:33

+1

ifelse的一個優點是可以輕鬆地嵌套它們。假設你想將顏色矢量轉換爲「純色」顏色:'color = c(「AliceBlue」,「BlueViolet」,「DarkRed」,「MediumVioletRed」,「DarkGreen」); ifelse(grepl( 「紅」,顏色), 「紅」,ifelse(grepl( 「綠」,顏色), 「綠色」,ifelse(grepl( 「藍」,顏色), 「藍」, 「其他」)) )' – xraynaud 2015-02-07 17:27:22

回答

14

可以使用grepl和ifelse聲明:

> color = c("AliceBlue", "BlueViolet", "DarkRed", "MediumVioletRed") 
> ifelse(grepl("Red",color),"red","other") 
[1] "other" "other" "red" "red" 
+0

謝謝,基本上docent discimus提供了一些示例代碼。 – Jazzmine 2015-02-07 17:17:09

3

你不需要ififelse這個任務。您可以使用sub

color <- c("darkred", "indianred", "violetred", "deep red", 
      "Orange Red", "blue", "yellow") 

sub(".*red.*", "red", color, ignore.case = TRUE) 
# [1] "red" "red" "red" "red" "red" "blue" "yellow" 

sub命令替換所有的字符串包括子"red""red"。此外,我爲ignore.case = TRUE指定了大小寫匹配。