2013-12-13 20 views
0

我遇到問題。我有以下的特徵向量:找到具有特定模式的列表中的字符值並創建一個新的

samples <- c("Ssa#STIR23728", "Ssa#STIR16345", "Omy#TC149733", "Ssa#S30265704", "Ssa#EG871857", "Omy#BX307934", "Omy#BE859148", 
      "Omy#CA358602","Ssa#EG933893", "Ssa#S30235521", "Ssa#STIR20818", "Ssa#STIR20525", "Ssa#KSS4270", "Ssa#TC106594", 
      "Omy#CX066437", "Ssa#CB506768", "Ssa#STIR06626", "Omy#CA358951", "Ssa#KSS3114_S", "Ssa#DW583553", "Ssa#DW552584", 
       "Ssa#KSS4345", "Ssa#STIR16873", "Ssa#DY699188", "Ssa#S35660380", "Ssa#EG781190", "Ssa#S31998243", 
      "Ssa#STIR23611", "Ssa#STIR20000") 

我需要建立一個新的特徵向量,其中一個新的名稱(「target_Stir」)分配給包含字符串「爆炒」,命名爲「鱒魚」的名字那些以「Omy」開始,而其餘的則稱之爲「控制」。我已經使用以下方法:

is.sample <- function(x) { 
    if(grepl("STIR", samples,ignore.case = T)) 
    return("Target_Stir") 
    if(grepl("Omy", samples,ignore.case = T)) 
    return("Trout") 
    else 
    return("control") 
} 
    labels <- lapply(samples, FUN=is.sample) 

不過,我回來了所有「控制」的載體和警告類似以下消息:

In if (grepl("STIR", control, ignore.case = T)) return("target") else ("control") : 
    the condition has length > 1 and only the first element will be used 

我是一名大三[R用戶,可以有人告訴我我做錯了什麼或者是否有更好的方法來做到這一點?考慮我只顯示我的數據的一個子集作爲例子,但我有一個長矢量(長度= 45000)和超過3個類。爲了簡單起見,我將舉一個簡短的例子。

謝謝,基督教

回答

0

grepl矢量化,並返回匹配和不匹配的邏輯矢量。您無需使用矢量化函數沿矢量循環。您可以使用grepl將您的samples矢量子集合並設置爲所需的值。

ids <- grepl("STIR" , samples , ignore.case = TRUE) 
samples[ ids ] <- "target" 
samples[ !ids ] <- "control" 
+0

謝謝西蒙,但我認爲,使我的例子我簡化了,因爲我有超過兩個類在整個向量。你能否提出一種方法來實現兩個以上的課程?謝謝 – ChristianD

+0

@ChristianD我認爲你應該更新這個問題,舉例說明你是如何擁有多種模式和替代值的。有很多方法可以做到這一點。 –

+0

嗨西蒙,我編輯了我的原始問題,使其更能代表我的整個數據集。我不認爲這應該會有很大的不同,如果我有更多的團隊,我可以使用相同的方法。感謝耐心! – ChristianD

相關問題