Как я могу сократить этот вектор без необходимости вводить каждый элемент? - PullRequest
1 голос
/ 03 октября 2019

как я могу сократить этот вектор без необходимости вводить каждый элемент? Я хочу использовать их в качестве меток на барплете, но я так долго нахожу код. Есть ли простой и короткий путь? Спасибо, я попробовал paste("1", letters[1:6], sep = ""), но, как видите, не дотянул, и я не знаю, как его удлинить.

c("1a", "1b", "1c", "1d", "1e", "1f", "2a" ,"2b", "2c"  , "2d", "2e", "2f", "3a", "3b", "3c", "3d", "3e", "3f", "3g", "4a", "4b", "4c", "4d" , "4e", "4f", "4g", "5a", "5b", "5c", "5d")

Ответы [ 4 ]

2 голосов
/ 03 октября 2019

Для переменной длины букв вы можете сделать

l_len <- c(6, 6, 7, 7, 4)
num <- rep(seq_along(l_len), l_len)
let <- unlist(lapply(l_len, function(i) letters[seq_len(i)]))

paste0(num, let)
# [1] "1a" "1b" "1c" "1d" "1e" "1f" "2a" "2b" "2c" "2d" "2e" "2f" "3a" "3b" "3c" "3d" "3e" "3f" "3g" "4a" "4b" "4c" "4d" "4e" "4f" "4g" "5a" "5b" "5c" "5d"

Для фиксированной длины цифр и букв вы можете использовать:

paste0(rep(1:5, each = 6), letters[1:6])
# [1] "1a" "1b" "1c" "1d" "1e" "1f" "2a" "2b" "2c" "2d" "2e" "2f" "3a" "3b" "3c" "3d" "3e" "3f" "4a" "4b" "4c" "4d" "4e" "4f" "5a" "5b" "5c" "5d" "5e" "5f"

paste0 - это сокращение от paste(..., sep = ""), rep повторяет аргумент 1:5 6 раз каждый, letters[1:6] повторяется автоматически, так что длина соответствует длине rep(1:5, each = 6).

1 голос
/ 03 октября 2019

Вот еще один способ использования outer

fun <- function(x, y) paste0(x, y)
c(t(outer(1:5, letters[1:6], Vectorize(fun))))
#[1] "1a" "1b" "1c" "1d" "1e" "1f" "2a" "2b" "2c" "2d" "2e" "2f" "3a" "3b" .....
0 голосов
/ 03 октября 2019

В качестве альтернативы избегая letters, как насчет использования десятичного числа в шестнадцатеричное?

unlist(Map(function(i) sprintf("%x", 16 * i + 10:15), 1:5))
#[1] "1a" "1b" "1c" "1d" "1e" "1f" "2a" "2b" "2c" "2d" "2e" "2f" "3a" "3b" "3c"
#[16] "3d" "3e" "3f" "4a" "4b" "4c" "4d" "4e" "4f" "5a" "5b" "5c" "5d" "5e" "5f"

Флаг "%x" выводит десятичное целое число в виде шестнадцатеричного целого числа;набор элементов соответствует номерам 16 * i + 10, 16 * i + 11, ..., 16 * i + 15 для i от 1 до 4.

0 голосов
/ 03 октября 2019

Вы можете использовать rep и sequence для получения нужного вектора:

x  <- c(6,6,7,7,4)
paste0(rep(seq_along(x), x), letters[sequence(x)])
# [1] "1a" "1b" "1c" "1d" "1e" "1f" "2a" "2b" "2c" "2d" "2e" "2f" "3a" "3b" "3c"
#[16] "3d" "3e" "3f" "3g" "4a" "4b" "4c" "4d" "4e" "4f" "4g" "5a" "5b" "5c" "5d"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...