我有问题。我有以下字符向量:
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
答案 0 :(得分:0)
grepl
vectorised 并返回匹配的逻辑向量而不匹配。您不需要使用矢量化函数循环向量。您可以使用grepl
对samples
向量进行子集化,并将其设置为所需的值。
ids <- grepl( "STIR" , samples , ignore.case = TRUE )
samples[ ids ] <- "target"
samples[ !ids ] <- "control"