我有想要清理的名字矢量。我想缩短每个字符的长度:
示例:
x <- c("LambMa, a.b.c., LaMa (shorter wording), LambM, abc , a.b.c",
"LambMa, a.b.c., LaMa (shorter wording)")
我想在这个例子中只获得第一个LambMa a.b.c.
并切断其余部分。因此,如果特定字符不包含a.b.c.
两次DO NOTHING(跳过)。
因此要查找的特定单词或表达式为"a.b.c"
。所以在第一次出现后切掉剩下的。
编辑:我想从向量a.b.c.
中获取x
(包含)之前的字符,以防在给定字符串{{1}中出现a.b.c.
的两倍}}
上述示例的解决方案是:
x
编辑2:部分解决方案也非常有用并且会被接受。感谢
答案 0 :(得分:2)
x <- c("LambMa, a.b.c., LaMa (shorter wording), LambM, abc , a.b.c",
"LambMa, a.b.c., LaMa (shorter wording)")
occ_abc<-gregexpr("a.b.c",x) # find the occurences of "a.b.c."
for(i in 1:length(occ_abc)){ # for each item of x
if(length(occ_abc[[i]])>=2) { # if there is 2 or more occurences
x[i]<-substr(x[i],1,occ_abc[[i]][1]+5) # replace with first part of the string
} else { # else leave the item untouched
x[i]
}
}
>x
[1] "LambMa, a.b.c." "LambMa, a.b.c., LaMa (shorter wording)"
if...else
部分很可能被ifelse
声明替换。
答案 1 :(得分:2)
如果指定的模式匹配,您可以使用gsub
换出。为避免使用后视,您可以捕获第一个a.b.c.
并替换为它:
gsub("(a\\.b\\.c\\.).+(a\\.b\\.c)","\\1",x)
[1] "LambMa, a.b.c."
[2] "LambMa, a.b.c., LaMa (shorter wording)"