2014-10-30 80 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