Как перевернуть строку, не влияя на числа в R? - PullRequest
0 голосов
/ 12 января 2019

Я хочу перевернуть строку, но без изменения чисел. Например:

ввод: "abcdef 123" вывод: "fedcba 123"

на данный момент я использую эту функцию, которую я нашел здесь, но она влияет на все символы:

name<-sapply(strsplit(name, split = ""),
           function(str) {paste(rev(str), collapse = "")})

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Надежное решение:

# convert vector of strings into list of vectors of words
words = strsplit(name, ' ', fixed = TRUE)

str_rev = sapply(words, function(x) {
  # we know some warnings may be created, ignore them
  suppressWarnings({
    is_num = !is.na(as.numeric(x))
  })

  # reverse non-numeric elements
  str_words = strsplit(x[!is_num], "", fixed = TRUE)
  x[!is_num] = sapply(str_words, function(y) {
    paste(rev(y), collapse = "")
  })
  paste(x, collapse = ' ')
})

Это позволяет применять правило в более общих случаях, когда вы не знаете, где появится числовое "слово", а name - как вектор:

name = c("abcdef 123", 'abc def 123', 'abc 123 def')
str_rev
# [1] "fedcba 123"  "cba fed 123" "cba 123 fed"
0 голосов
/ 12 января 2019

Вот один вариант, который использует stri_reverse из stringi

library(stringi)
library(gsubfn)
gsubfn("([^0-9 ]+)", ~ stri_reverse(x), name)
#[1] "fedcba 123"  "cba fed 123" "cba 123 fed"

Или как @G. Гротендик упомянул, анонимный вызов функции может быть удален

gsubfn("([^0-9 ]+)", stri_reverse, name)

данные

name <- c("abcdef 123", 'abc def 123', 'abc 123 def')
0 голосов
/ 12 января 2019

Вот один из способов:

Случай 1:

a <- "abcdef 123"

# split the string
split_a <- unlist(strsplit(a, " "))

# reverse it
paste(paste(rev(strsplit(split_a[1],'')[[1]]), collapse = ''), split_a[2])

"fedcba 123"

Дело 2:

a <- "abc def 123"

# split the string
split_a <- unlist(strsplit(a, " "))

# removing the last word
to_split <- split_a[-length(split_a)]

reversed <- paste(sapply(lapply(strsplit(to_split, NULL), rev), paste, collapse=''), collapse=' ')

final <- paste(reversed, split_a[length(split_a)], collapse=" ")

[1] "cba fed 123"
...