2014-10-30 85 views
0

我有我想要清理的名称向量。我想缩短每个字符长度:在R中特定单词之后限制字符长度

实施例:

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.两次请不要(跳过)。

因此,要查找的特定单词或表达式是"a.b.c"。所以在第一次出现之后就休息一下。

编辑:我想之前a.b.c.(包括)从向量x万一在给定字符串x仅获得字符a.b.c.的有双发生。

将溶液于上面的例子将是:

solution <- c("LambMa, a.b.c.","LambMa, a.b.c., LaMa (shorter wording)") 

编辑2:也部分解决方案将是非常有益的,将被接受。由于

+1

我不完全遵循您所问的内容。你能为你的例子提供预期的输出吗? – James 2014-10-30 10:18:53

+0

为什么您的样品解决方案从输入重新排序?顺便说一句,如果你的'名字'总是以逗号分隔的,我建议使用'strsplit'将行分解为一个值的向量并处理。 – 2014-10-30 11:34:46

+0

感谢您的关注!重新排序?对不起,我不明白你的意思。解决方案的第一部分是a.b.c之前的所有输入。 (包括),第二个保持完整,因为没有a.b.c的重复输入。 – Maximilian 2014-10-30 11:41:26

回答

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

这实际上适用于我。谢谢! – Maximilian 2014-10-30 13:52:07

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语句来代替。

+0

谢谢,它适用于示例,但不适用于“真实”数据。但是解决方案提供了所要求的内容。所以如果没有人提供更好的答案,我会接受你的。谢谢! – Maximilian 2014-10-30 12:14:34

+0

@Max,你的“真实”数据是什么样的?如果您提供的数据更像您的“真实”数据,我可以尝试并修改我的代码... – Cath 2014-10-30 12:16:30

+1

@Max,如果您将'search_char < - “abc”'替换为'abc'在'if'指令中用'nchar(search_char)-1'指定'occ_abc'和'5'中的search_char' ...当然'search_char'可以是任何东西 – Cath 2014-10-30 12:40:10