2017-08-30 54 views
1

我想在我的數據集中創建一個新列:i)如果單詞本身以「vi」開頭,則刪除最後一個字符;和ii)如果單詞本身不以「vi」開始,則丟棄最後2個字符。我知道如何在R於這項工作,象下面這樣:有條件的變異由dplyr

iris$Species <- as.character(iris$Species) 
iris$Species_mod <- substr(iris$Species, 
          1, 
          ifelse(grepl('^vi',iris$Species), 
            nchar(iris$Species)-1, 
            nchar(iris$Species)-2)) 

但我有一個很難破譯mutate,在dplyr if_elsematches。任何人都可以啓發我嗎?謝謝!

+0

你試過從''tidyverse' case_when'? – Aramis7d

回答

0

同樣的想法,除非你明確地需要你的因素轉換爲字符串

iris = mutate(iris, Species_mod = substr(Species, 1, nchar(as.character(Species)) - 
    ifelse(grepl('^vi', Species), 1, 2))) 
+0

不能正常工作,它返回一個錯誤:'在mutate_impl(.data,dots)中出錯: 評估錯誤:'nchar()'需要一個字符vector.' – lokheart

+0

我的歉意:我已經編輯了我的答案。 – lebelinoz

0

你可以嘗試這樣的:

iris %>% 
    mutate(Species = as.character(Species)) %>% 
    rowwise() %>% 
    mutate(species2 = case_when(
    Species == 'vi%' ~ substr(Species, 0, nchar(Species) - 1), 
    Species != 'vi%' ~ substr(Species, 0, nchar(Species) - 2) 
))