у меня есть эта строка
D = c("0" , "11", "12", "13", "14", "15", "16", "21", "22", "23", "24", "25", "26", "31", "32", "33", "34", "35", "36", "41", "42", "43", "44","45", "46","51","52", "53", "54", "55", "56", "61", "62", "63", "64", "65", "66")
Если бы я хотел удалить эти символы ниже 30, не преобразовывая строку в числовую, что мне делать?
Если бы я хотел переупорядочить строку на основе номера единицы (это означает, что все те, у которых последняя 1, идут перед теми, у кого последние два и т. д., такие как 31, 41, 51, 61, 32, 42 и т. д., что должно быть операция?
Спасибо
Извините моя ошибка. Я думаю, теперь все должно пройти хорошо





Вам не нужно преобразовывать в числовые, D[D >= 30] работает нормально. >= работает также для векторов символов, и сортировка зависит от вашего языка. Проверьте ?Comparison для более подробной информации.
D[D >= "30"]
#[1] "31" "32" "33" "34" "35" "36" "41" "42" "43" "44" "45" "46" "51" "52" "53" "54" "55" "56" "61" "62" "63" "64" "65" "66"
Для сортировки это будет работать (но, вероятно, только если у вас есть двузначные числа):
str_rev <- stringi::stri_reverse
str_rev(sort(str_rev(D[D >= "30"])))
# [1] "31" "41" "51" "61" "32" "42" "52" "62" "33" "43" "53" "63" "34" "44" "54" "64" "35"
#[18] "45" "55" "65" "36" "46" "56" "66"
Или с str_sub:
library(stringr)
D[order(str_sub(D, -1, -1))]
Пожалуйста, проверьте приведенный ниже код
D2 <- enframe(D) %>% arrange(value) %>% filter(value>30) %>%
mutate(value2=str_extract(value,'\\d$')) %>%
arrange(value2) %>% pull(value)
Created on 2023-07-14 with reprex v2.0.2
[1] "31" "41" "51" "61" "32" "42" "52" "62" "33" "43" "53" "63" "34"
[14] "44" "54" "64" "35" "45" "55" "65" "36" "46" "56" "66"
Не уверен, что следую вашей логике, но как насчет этого решения?
D[str_detect(D,"^[12]\\d|0$")]
Код регулярного выражения — это в основном все, что начинается с 1/2, за которым следует цифра или 0. Для этого требуется пакет stringr 9часть tidyverse). Вы можете использовать для этого baseR, но лучше использовать tidyverse (base R будет grepl(pattern,string))
В противном случае я бы определенно продолжил D[D<30], но это может быть обман
1.) можно выполнить с помощью операции сравнения !=, которая не выполняет преобразование чисел (для числовых строк <= 2 цифр).
2.) — это операция упорядочивания, которая внутренне может полагаться на преобразование в числовую или алфавитную сортировку кодовой таблицы ASCII.
D_new <- D[sapply(strsplit(D, ""), \(x)
ifelse(length(x) > 1 & x[1] != "1" & x[1] != "2", T, F))]
D_new[order(sapply(strsplit(D_new, ""), \(x) x[2]))]
[1] "31" "41" "51" "61" "32" "42" "52" "62" "33" "43" "53" "63" "34" "44" "54"
[16] "64" "35" "45" "55" "65" "36" "46" "56" "66"
Другой способ извлечь вторую цифру — разделить D на 10 и использовать
остаток. Вот как это может выглядеть:
library(tidyverse)
D <- D[D >= 30]
data.frame(D) |>
mutate(second_digit = as.numeric(D) %% 10) |>
arrange(second_digit) |>
filter(D > 30) |>
pull(D)
#> [1] "31" "41" "51" "61" "32" "42" "52" "62" "33" "43" "53" "63" "34" "44" "54"
#> [16] "64" "35" "45" "55" "65" "36" "46" "56" "66"
Другой вариант с регулярным выражением. Любое число 3-9, за которым следует другое число 0-9.
D[grepl("^[3-9][0-9]", D)]
#> [1] "31" "32" "33" "34" "35" "36" "41" "42" "43" "44" "45" "46" "51" "52" "53"
#> [16] "54" "55" "56" "61" "62" "63" "64" "65" "66"
Ваши входные данные кажутся неправильными. Это вектор, в котором отсутствуют запятые, разделяющие записи, или это строка со слишком большим количеством
"?