使用特定模式在列表中查找字符值并创建新值

时间:2013-12-13 12:34:55

标签: r character

我有问题。我有以下字符向量:

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")

我需要创建一个新的字符向量,在其中为包含字符串“STIR”的名称分配一个新名称(“target_Stir”),将名称“Trout”分配给以“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个类。为简单起见,我举一个简短的例子。

谢谢,Christian

1 个答案:

答案 0 :(得分:0)

grepl vectorised 并返回匹配的逻辑向量而不匹配。您不需要使用矢量化函数循环向量。您可以使用greplsamples向量进行子集化,并将其设置为所需的值。

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