Как изменить строку в 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"
Ответы
Ответ 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)