Создание вектора чисел на основе букв - PullRequest
2 голосов
/ 30 октября 2019

Итак, вот вопрос:

"Создайте функцию, в которой задано одно слово, верните положение букв слова в векторе букв. Например, если слово" abba ", функция вернет1 2 2 1. "

То, что у меня до сих пор, таково:

l <- function(word) {
    chr <- c()
    y <- c()
    strsplit(chr,word)
    i<-1
    while(i<length) {
           o<-letters[i]
           x<-chr[i]
           if(o==x) {
                    y[i]<-i
           }
           i+1
    }
    y
}

Я попытался запустить l (" привет "), и он возвращает NULL. Я очень потерян и буду признателен за любую помощь! Спасибо!

Ответы [ 3 ]

6 голосов
/ 30 октября 2019

С base R:

lapply(strsplit(x, "", fixed = TRUE), match, letters)

[[1]]
[1] 1 2 2 1
1 голос
/ 30 октября 2019

Я предоставляю еще одну интересную функцию в base:

x <- "abcxyz"
strtoi(strsplit(x, "")[[1]], 36) - 9
# [1]  1  2  3 24 25 26

strtoi() преобразует систему счисления base-n в base-10 (т.е. десятичная ) система счисления. Например, base-16 (то есть шестнадцатеричный ), strtoi("12", base = 16) получит 18, потому что 12 в шестнадцатеричном - это 18 в десятичном виде. Если база равна 36, strtoi() отобразит (1 ~ 9, a ~ z) на 1 ~ 35 , а именно a ~ z в a *Система 1025 * base-36 имеет десятичное значение 10 ~ 35 . -9 в моем коде преобразует 10 ~ 35 в 1 ~ 26, что и требуется для OP. Другое распространенное использование - это преобразование двоичного числа в десятичное число. Например, strtoi("01001", base = 2) получает 9.

0 голосов
/ 30 октября 2019
library(purrr)
my_fun <- function(x) {
  x %>% 
    strsplit("") %>% 
    map(factor, levels = letters) %>% 
    map(as.numeric)
}


x <- c("abba", "hello")
my_fun(x)
#> [[1]]
#> [1] 1 2 2 1
#> 
#> [[2]]
#> [1]  8  5 12 12 15

Здесь мы используем, что факторы - это целые числа под капотом.

Пусть str будет символьным вектором, например str <- c('a', 'b', 'b', 'a'). Когда мы запускаем factor(str, levels = letters), мы конвертируем его в коэффициент с 26 уровнями: «a», «b», «c» и так далее. Если к нему применить as.integer, a станет 1, потому что это первый уровень, 'b' - 2 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...