Как удалить числовые значения как символы и использовать строку согласно номеру единицы измерения

у меня есть эта строка

 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") 
  1. Если бы я хотел удалить эти символы ниже 30, не преобразовывая строку в числовую, что мне делать?

  2. Если бы я хотел переупорядочить строку на основе номера единицы (это означает, что все те, у которых последняя 1, идут перед теми, у кого последние два и т. д., такие как 31, 41, 51, 61, 32, 42 и т. д., что должно быть операция?

Спасибо

Ваши входные данные кажутся неправильными. Это вектор, в котором отсутствуют запятые, разделяющие записи, или это строка со слишком большим количеством "?

mhovd 14.07.2023 17:07

Извините моя ошибка. Я думаю, теперь все должно пройти хорошо

12666727b9 14.07.2023 17:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
51
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Вам не нужно преобразовывать в числовые, 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"

Другие вопросы по теме