2

「;」で区切られたいくつかの ID を示すこの文字列s=";123;;123;;456;;124;;123;;567;"を R に持つと、繰り返される ID を見つけたいので、この場合は「;123;」になります。が繰り返されます。Rで次のコマンドを使用しました:

gregexpr("(;[1-9]+;).*\1", s)

しかし、繰り返しパターンは見つかりません。何が間違っているのですか?

長い文字列の一例:

1760381;;1774536;;1774614;;1774617;;1774705;;1774723;;1775013;;1902321;;1928678;;2105486;;2105514;;2105544;;2105575;;2105585;;2279115;;2379236;;290927;;542280;;555749;;641540;;683822;;694934;;713228;;713248;;713249;;726949;;727204;;731434;;754522;;7693856;;100095;;1003838;;1045582;;1079057;;1108697;;1231229;;124087;;1249672;;1328126;;1412065;;1419930;;1441743;;1470580;;1476585;;1502106;;1556149;;1637775;;1643922;;1655644;;1755547;;1759001;;1760295;;1760296;;1760320;;1760326;;1760338;;1760348;;1760349;;1760350;;1760353;;1760375;;1760376;;1760377;;1760378;;1760388;;1760401;;1760402;;1760403;;1760410;;1760421;;1760425;;1760426;;1760642;;1760654;;1770463;;1774365;;1774366;;1774394;;1774449;;1774453;;1774454;;1774455;;1774456;;1774457;;1774458;;1774461;;1774462;;1774463;;1774464;;1774466;;1774469;;1774504;;1774505;;1774506;;1774519;;1774520;;1774525;;1774527;;1774529;;1774532;;1774533;;1774539;;1774542;;1774593;;1774595;;1774604;;1774610;;1774616;;1774617;;1774641;;1774660;;1774671;;1774674;;1774684;;1774687;;1774694;;1774704;;1774706;;1774713;;1774717;;1774722;;1774723;;1774726;;1774733;;1774745;;1774750;;1774753;;1774754;;1774766;;1774784;;1774786;;1774795;;1774799;;1774800;;1774803;;1774809;;1774813;;1774835;;1774849;;1774852;;1774853;;1774854;;1774857;;1774858;;1774861;;1774862;;1774867;;1774868;;1774869;;1774870;;1774877;;1774878;;1774880;;1774884;;1774885;;1774886;;1774902;;1774905;;1774934;;1774935;;1774937;;1774939;;1774946;;1774949;;1774950;;1774958;;1774959;;1774960;;1774961;;1774962;;1774964;;1774965;;1774966;;1774967;;1774969;;1774971;;1774972;;1774973;;1774975;;1774977;;1774978;;1774999;;1775000;;1775003;;1775005;;1775006;;1775009;;1775013;;1775014;;1775017;;1775024;;1775026;;1775033;;1775038;;1775040;;1775041;;1775044;;1775087;;1785544;;1811645;;1837210;;1864356;;1928674;;1928678;;1932882;;1954203;;2066856;;2076876;;2105349;;2105351;;2105458;;2105464;;2105476;;2105480;;2105482;;2105484;;2105489;;2105496;;2105500;;2105510;;2105514;;2105518;;2105532;;2105545;;2105550;;2172257;;2172762;;218438;;2228198;;2229827;;2247909;;2262250;;2263135;;2287260;;2335872;;2335873;;2335874;;2335877;;2338682;;2352560;;2420902;;263946;;265370;;303060;;330571;;338764;;387492;;387750;;388362;;431807;;436056;;436442;;444058;;458026;;491696;;504783;;513098;;529228;;539799;;549649;;559957;;562574;;563116;;576418;;582851;;592273;;599952;;614463;;626416;;645122;;652363;;665854;;668048;;682877;;683822;;688317;;709795;;710684;;723114;;724447;;724526;;725177;;731389;;731434;;876958;;879962;;947924;;987322;;987446;;61326;;1025952;;1095970;;1338018;;1349990;;1373122;;1419930;;1760310;;1760320;;1774705;;1774706;;1774708;;1774712;;1774952;;1774954;;1774963;;1774972;;1774977;;1775077;;1901075;;2022080;;2117779;;2143723;;441554;;450517;;549649;;1010402;;113311;;1148258;;1374348;;1419930;;1606449;;1606515;;1606608;;1606610;;1760320;;1760338;;1760618;;1760642;;1774504;;1774520;;1774595;;1774705;;1774909;;1774977;;1775011;;1775043;;179542;;1928678;;2105598;;2105721;;2188303;;2335873;;340762;;387759;;436442;;504783;;588336;;646185;;682877;;715644;;725080;;741661;;760924
4

2 に答える 2

2

1)例では、ID はすべて同じ長さであるため、これは一般的な機能であると想定しています。(?=...)が幅ゼロの先読み式であるこのパターンを試してください(「 」を参照?regex) 。

pat <- ";([1-9]+);(?=.*\\1)"
gregexpr(pat, s, perl = TRUE)

またはこれ:

library(gsubfn)
strapply(s, pat, perl = TRUE)[[1]]
## [1] "123" "123"

これは、それぞれidの出現回数よりも少ない回数 (重複していない ID の場合は 0 回)sをリストするため、重複した各 ID を一意にリストするには、上記のコードの最後の行の結果がunique(st)どこにあるかを試してください。st

注:質問の 2 番目の例、つまり長い文字列では;、文字列の末尾に no がないため、最初に a;を末尾に貼り付けない限り、最後の ID が式と一致することはありません。

2)コンテンツを一致させる代わりに、区切り文字を一致させることができます。

strsplit(s, ";")[[1]])[-1]

stがこのコード行の結果である場合は、stすべての ID の単なるベクトルであるため、unique(st[duplicated[st])重複した各 ID を一意にリストし、正規表現を含みません。

于 2013-10-20T14:40:16.217 に答える
2
 m<-gregexpr("[0-9]+",s)
n<-regmatches(s,m)
[[1]]
[1] "123" "123" "456" "124" "123" "567"


data.frame(table(unlist(n)))
  Var1 Freq
1  123    3
2  124    1
3  456    1
4  567    1

コードは長い形式の文字列でも機能します。出力のheadandは次のとおりです。tail

head(data.frame(table(unlist(n))),10)
      Var1 Freq
1   100095    1
2  1003838    1
3  1010402    1
4  1025952    1
5  1045582    1
6  1079057    1
7  1095970    1
8  1108697    1
9   113311    1
10 1148258    1

tail(data.frame(table(unlist(n))),10)
       Var1 Freq
316  731434    2
317  741661    1
318  754522    1
319  760924    1
320 7693856    1
321  876958    1
322  879962    1
323  947924    1
324  987322    1
325  987446    1
于 2013-10-20T12:44:04.447 に答える