我试图在数据框的列中找到所有回文词“数据'看起来像:
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; ......等 我希望能够仅将 回文的单词进行子集化,然后将它们返回到数据框,以便将它们与其他列相关联,以查找它们发生的次数和次数。
答案 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
(是的,我从两种算法中得到了相同的实际答案)