4

2 つのフィールドを持つ R データフレームがあります。

ID             WORD
1           AAAAABBBBB
2           ABCAAABBBDDD
3           ...

文字のみを保持し、重複を繰り返さないことで、文字の繰り返しで単語を単純化したいと思います。

例:AAAAABBBBB私に与えるべきであり、私ABABCAAABBBDDD与えるべきですABCABD

誰でもこれを行う方法について考えがありますか?

4

2 に答える 2

8

正規表現を使用したソリューションは次のとおりです。

x <- c('AAAAABBBBB', 'ABCAAABBBDDD')
gsub("([A-Za-z])\\1+","\\1",x)

編集:リクエストにより、いくつかのベンチマーク。任意の文字に一致する Matthew Lundberg のパターンをコメントに追加しました。gsub桁違いに速いようで、任意の文字の一致は文字の一致よりも高速です。

library(microbenchmark)
set.seed(1)
##create sample dataset
x <- apply(
  replicate(100,sample(c(LETTERS[1:3],""),10,replace=TRUE))
,2,paste0,collapse="")
##benchmark
xm <- microbenchmark(
    SAPPLY = sapply(strsplit(x, ''), function(x) paste0(rle(x)$values, collapse=''))
    ,GSUB.LETTER = gsub("([A-Za-z])\\1+","\\1",x)
    ,GSUB.ANY = gsub("(.)\\1+","\\1",x)
)
##print results
print(xm)
# Unit: milliseconds
         # expr       min        lq    median        uq       max
# 1    GSUB.ANY  1.433873  1.509215  1.562193  1.664664  3.324195
# 2 GSUB.LETTER  1.940916  2.059521  2.108831  2.227435  3.118152
# 3      SAPPLY 64.786782 67.519976 68.929285 71.164052 77.261952

##boxplot of times
boxplot(xm)
##plot with ggplot2
library(ggplot2)
qplot(y=time, data=xm, colour=expr) + scale_y_log10()
于 2013-01-04T14:55:34.850 に答える
4
x <- c('AAAAABBBBB', 'ABCAAABBBDDD')
sapply(strsplit(x, ''), function(x) paste0(rle(x)$values, collapse=''))
## [1] "AB"     "ABCABD"
于 2013-01-04T14:53:50.970 に答える