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

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

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

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

> test  test [1] "g" "r" "e" "g" > test_rev  test_rev [1] "g" "e" "r" "g" > paste(test_rev) [1] "g" "e" "r" "g" 

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

 paste(test_rev, collapse='') 

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

 > paste(letters[1:5],letters[1:5]) [1] "aa" "bb" "cc" "dd" "ee" 

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

От ?strsplit – функция, которая будет ?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" 

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

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

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

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

Следующим может быть полезный способ обратного strsplit векторов строк 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) 

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

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

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

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

Если ваши данные находятся в 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 

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

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

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

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

[1] "abcdefghijklmnopqrstuvwxyz"

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

revString(myString)

[1] "zyxwvutsrqponmlkjihgfedcba"

revString(myString, 1:5)

[1] "zyxwv"

Вот решение с 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" 
 ##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")) } 

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

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

Вот еще одно решение 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 .

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

 revstring=function(s) print(paste(rev(strsplit(s,"")[[1]]),collapse="")) str=readline("Enter the string:") revstring(str) 

Вы можете использовать функцию rev (), как указано в предыдущем сообщении.

 `X <- "MyString" 

RevX <- paste(rev(unlist(strsplit(X,NULL))),collapse="")

Выход: "gnirtSyM"

Благодаря,

Таким образом, очевидно, что разработчикам JS-интерфейсов предлагается сделать это (для интервью) в JS без использования встроенных функций обратной связи. Мне потребовалось несколько минут, но я придумал:

 string <- 'hello' foo <- vector() for (i in nchar(string):1) foo <- append(foo,unlist(strsplit(string,''))[i]) paste0(foo,collapse='') 

Что все может быть завернуто в функцию ...

Что относительно функционалов более высокого порядка? Уменьшить?

  • Найдите, сколько раз повторяющиеся строки повторяются в кадре данных R
  • Поиск локальных максимумов и минимумов
  • Существует pmin и pmax, каждый из которых принимает na.rm, почему нет psum?
  • Открытие всех файлов в папке и применение функции
  • Перемещение столбцов в data.frame () без повторного набора
  • Вычисление суммарной суммы для каждой строки
  • Прочтите файл csv в R со столбцом валюты как числовой
  • Извлечение строк для первого вхождения переменной в фрейм данных
  • Как проверить, вызывает ли вызов функции предупреждение?
  • Перекодирование переменных с помощью R
  • Увеличение на 1 для каждого изменения в столбце
  • Давайте будем гением компьютера.