在R中的数据框中查找回文词

时间:2014-10-13 12:30:23

标签: r dataframe palindrome

我试图在数据框的列中找到所有回文词“数据'看起来像:

name year amount 
 James 2010  934706
 Aza   2010  21042
 Rory  2010   869691
 Suzanne 2010 651674
 Felicity 2010 386115
 Oliver   2010  382388
 Anna     2010   43211

我试过了:

palindrome <- function(word) {
rawWord <- charToRaw(tolower(word)) ## converts to lower case
 sprintf("%s is %sa palindrome", word,
    c("not ", "")[identical(rawWord, rev(rawWord)) + 1])
     }
palindrome(data)

但是这会返回一个&#34; mary不是回文的列表&#34; &#34;安娜不是回文&#34; ......等 我希望能够仅将 回文的单词进行子集化,然后将它们返回到数据框,以便将它们与其他列相关联,以查找它们发生的次数和次数。

2 个答案:

答案 0 :(得分:3)

您可以执行以下步骤。

rawdata <- sapply(tolower(data$name), charToRaw)

# Array of booleans. TRUE if palindromic. FALSE if not
ispalindrom <- unlist(lapply(rawdata, function(x) identical(x, rev(x))))

# Palindromic words
data[ispalindrom,]

# Non palindromic words
data[! ispalindrom,]

答案 1 :(得分:2)

我想知道效率,所以我写了相同的算法,但使用了字符:

palchar <-function(nfoo) {
spfoo<-list()
ispalindrom<-vector()
rawdata <- sapply( 1:length(nfoo), function(j) strsplit(tolower(nfoo[j]), '') )
    ispalindrom <-unlist(sapply(1:length(nfoo),function(j) identical(rawdata[[j]],rev(rawdata[[j]]))) )
    return(ispalindrom)
}

相对表现是:

 nfoo<-rep(nfoo,10)
 microbench0mark(palbyte(nfoo),palchar(nfoo))
Unit: milliseconds
          expr      min       lq   median       uq      max
 palbyte(nfoo) 7.154999 7.435734 7.538363 7.648477 124.8712
 palchar(nfoo) 9.224697 9.531945 9.713685 9.850097 127.2356
 neval
   100
   100

(是的,我从两种算法中得到了相同的实际答案)