私は持っている
str=c("00005.profit", "00005.profit-in","00006.profit","00006.profit-in")
そして手に入れたい
"00005.profit" "00006.profit"
grep
Rを使用してこれを達成するにはどうすればよいですか?
これが1つの方法です:
R> s <- c("00005.profit", "00005.profit-in","00006.profit","00006.profit-in")
> unique(gsub("([0-9]+.profit).*", "\\1", s))
[1] "00005.profit" "00006.profit"
R>
正規表現は、数字の後に.profit
、が続くものとして定義します。これは、式を括弧内に保持することによって割り当てます。次に\\1
、最初のそのような割り当てを思い出します-そして私たちが得たものは他に何も思い出さないので。次にunique()
、4つのアイテムを2つの固有のアイテムに減らします。
-
Dirk's answer はほとんど理想的な一般化可能な答えですが、例には常に切り落としたい部分から始まる文字があるという事実に基づいて、いくつかの他のオプションがあります。
1:gsub
以前のすべてを返す-
gsub("(.+)-.+","\\1",str)
2:strsplit
オンに-
して最初の部分だけを保持します。
sapply(strsplit(str,"-"),head,1)
どちらも次を返します。
[1] "00005.profit" "00005.profit" "00006.profit" "00006.profit"
unique
次のような重複を返さないようにラップできます。
unique(gsub("(.+)-.+","\\1",str))
unique(sapply(strsplit(str,"-"),head,1))
これらは次を返します。
[1] "00005.profit" "00006.profit"
別の一般化できない解決策は、最初の 12 文字だけを取得することです (保持したい部分の文字列の長さが変わらないと仮定します)。
unique(substr(str,1,12))
[1] "00005.profit" "00006.profit"
私は実際にあなたの質問を異なって解釈しています。私はあなたが望むかもしれないと思います
grep("[0-9]+\\.profit$",str,value=TRUE)
つまり、で終わる文字列のみが必要な場合ですprofit
。特殊文字は「$
文字列の終わり」を表すため、末尾に追加の文字がある場合は除外されます... \\.
「文字ではなく、ドットと一致させたい」という意味です(a.
自体はすべての文字と一致します) )。ターゲットパターンについて完全に明確ではありませんでした。"0+[1-9]\\.profit$"
(任意の数のゼロの後に1つの非ゼロの数字が続く)、または"0{4}[1-9]\\.profit$"
(4つのゼロの後に1つの非ゼロの数字が続く)ことを好むかもしれません。