2017-12-06 20 views
0
#working example 
col1 <- c("cat", "cats", "cat2", "dog", "carrot", "carrots", "broccoli", 
"squash", "tundra", "grassland", "grasslands") 
df <- as.data.frame(col1) 

文字列が動物、野菜、またはバイオームであるかどうかを識別する新しい列を作成したいとします。他の文字列でネストされたifelseステートメントでgreplを使用する

所望の出力:

  col1  col2 
1   cat animal 
2  cats animal 
3  cat2 animal 
4   dog animal 
5  carrot vegetable 
6  carrots vegetable 
7 broccoli vegetable 
8  squash vegetable 
9  tundra  biome 
10 grassland  biome 
11 grasslands  biome 

私は、次のコードのgrepl部分が動作しない理由を理解したいと思います。

df_new <- df %>% mutate(col2 = ifelse(col1 %in% c("dog", grepl("cat", col1)), "animal", 
    ifelse(col1 %in% c(grepl("carrot", col1), "broccoli", "squash"), "vegetable", 
    ifelse(col1 %in% c("tundra", grepl("grassland", col1)), "biome", NA)))) 
+2

それは 'case_when'使用する方が簡単です:' DF%>%に変異(COL2 = case_when(grepl( '猫|犬' を、 col1)〜 'animal'、grepl( 'ニンジン|ブロッコリー|スカッシュ'、col1)〜 '野菜'、grepl( 'tundra | grassland'、col1)〜 'biome')) 'またはルックアップテーブル – alistaire

答えて

1

greplあなたがgrep(..., value=TRUE)を必要とし、論理的なベクトルを返します。

df %>% 
    mutate(col2 = ifelse(col1 %in% c("dog", grep("cat", col1, value=T)), "animal", 
        ifelse(col1 %in% c(grep("carrot", col1, value=T), "broccoli", "squash"), "vegetable", 
        ifelse(col1 %in% c("tundra", grep("grassland", col1, value=T)), "biome", NA)))) 

#   col1  col2 
#1   cat animal 
#2  cats animal 
#3  cat2 animal 
#4   dog animal 
#5  carrot vegetable 
#6  carrots vegetable 
#7 broccoli vegetable 
#8  squash vegetable 
#9  tundra  biome 
#10 grassland  biome 
#11 grasslands  biome 
+1

大変感謝しています。 greplの代わりにgrepを試しましたが、値= Tについては分かりませんでした。 –

関連する問題