Подтвердить что ты не робот

Как изменить строку в R

Я пытаюсь научить себя R, и при выполнении некоторых пробных проблем мне пришла в голову необходимость изменить строку.

Здесь то, что я пробовал до сих пор, но операция вставки не имеет никакого эффекта.

Должно быть, я не понимаю списки? (Я также не понимаю, зачем мне нужно [[1]] после strsplit.)

> test <- strsplit("greg", NULL)[[1]]
> test
[1] "g" "r" "e" "g"
> test_rev <- rev(test)
> test_rev
[1] "g" "e" "r" "g"
> paste(test_rev)
[1] "g" "e" "r" "g"
4b9b3361

Ответ 1

Как указывает @mplourde, вам нужен аргумент collapse:

paste(test_rev, collapse='')

Большинство команд в R векторизованы, но как именно команда обрабатывает векторы, зависит от команды. paste будет работать над несколькими векторами, объединяя i -й элемент каждого из них:

> paste(letters[1:5],letters[1:5])
[1] "a a" "b b" "c c" "d d" "e e"

collapse указывает, что он работает внутри вектора.

Ответ 2

От ?strsplit - функция, которая будет отбрасывать каждую строку в векторе строк:

## a useful function: rev() for strings
strReverse <- function(x)
        sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")
strReverse(c("abc", "Statistics"))
# [1] "cba"        "scitsitatS"

Ответ 3

stringi имеет эту функцию довольно долго:

stringi::stri_reverse("abcdef")
## [1] "fedcba"

Также обратите внимание, что он векторизован:

stringi::stri_reverse(c("a", "ab", "abc"))
## [1] "a"   "ba"  "cba"

Ответ 4

Вы также можете использовать пакет IRanges.

library(IRanges)
x <- "ATGCSDS"
reverse(x)
# [1] "SDSCGTA"

Вы также можете использовать пакет Biostrings.

library(Biostrings)
x <- "ATGCSDS"
reverse(x)
# [1] "SDSCGTA"

Ответ 5

Ниже приведен полезный способ обращения к вектору строк x и немного быстрее (и более эффективен с точки зрения памяти), поскольку он позволяет избежать генерации списка (как при использовании strsplit):

x <- rep( paste( collapse="", LETTERS ), 100 )
str_rev <- function(x) {
  sapply( x, function(xx) { 
    intToUtf8( rev( utf8ToInt( xx ) ) )
  } )
}
str_rev(x)

Если вы знаете, что собираетесь работать с символами ASCII и скоростью, существует быстрая реализация C для изменения вектора строк, встроенных в Kmisc:

install.packages("Kmisc")
str_rev(x)

Ответ 6

Если ваши данные находятся в data.frame, вы можете использовать sqldf:

myStrings <- data.frame(forward = c("does", "this", "actually", "work"))
library(sqldf)
sqldf("select forward, reverse(forward) `reverse` from myStrings")
#    forward  reverse
# 1     does     seod
# 2     this     siht
# 3 actually yllautca
# 4     work     krow

Ответ 7

Вот функция, которая возвращает всю обратную строку, или, возможно, обратную строку, содержащую только элементы, указанные index, считая назад от последнего символа.

revString = function(string, index = 1:nchar(string)){
  paste(rev(unlist(strsplit(string, NULL)))[index], collapse = "")
}

Сначала определите легко узнаваемую строку в качестве примера:

(myString <- paste(letters, collapse = ""))

[1] "abcdefghijklmnopqrstuvwxyz"

Теперь попробуйте функцию revString с индексом и без него:

revString(myString)

[1] "zyxwvutsrqponmlkjihgfedcba"

revString(myString, 1:5)

[1] "zyxwv"

Ответ 8

Здесь решение с gsub. Хотя я согласен, что проще с strsplit и paste (как указано в других ответах), может быть интересно увидеть, что он также работает с регулярными выражениями:

test <- "greg"

n <- nchar(test) # the number of characters in the string

gsub(paste(rep("(.)", n), collapse = ""),
     paste("", seq(n, 1), sep = "\\", collapse = ""),
     test)

# [1] "gerg"

Ответ 9

##function to reverse the given word or sentence

reverse <- function(mystring){ 
n <- nchar(mystring)
revstring <- rep(NA, n)
b <- n:1
c <- rev(b)
for (i in 1:n) {
revstring[i] <- substr(mystring,c[(n+1)- i], b[i])
 }
newrevstring <- paste(revstring, sep = "", collapse = "")
return (cat("your string =", mystring, "\n",
("reverse letters = "), revstring, "\n", 
"reverse string =", newrevstring,"\n"))
}

Ответ 10

Самый простой способ изменить строку:

#reverse string----------------------------------------------------------------
revString <- function(text){
  paste(rev(unlist(strsplit(text,NULL))),collapse="")
}

#example:
revString("abcdef")

Ответ 11

Вот еще одно решение base-R:

# Define function
strrev <- function(x) {
  nc <- nchar(x)
  paste(substring(x, nc:1, nc:1), collapse = "")
}

# Example
strrev("Sore was I ere I saw Eros")
[1] "sorE was I ere I saw eroS"

Решение было вдохновлено эти U. Auckland слайды.

Ответ 12

Следующий код будет вводить пользователя и отменять всю строку -

revstring=function(s)
print(paste(rev(strsplit(s,"")[[1]]),collapse=""))

str=readline("Enter the string:")
revstring(str)