Различие между числовыми строками и прочими строками

Я хочу провести логический тест, чтобы различать векторы строк, которые, кроме ":", состоят только из чисел (например, вектор B), И векторы строк, которые, кроме ":", НЕ состоят только из чисел (например, вектор A).

Имя этого логического теста может быть is_num_vec (Смотри ниже). Возможно ли это в R?

A = c("prof2:wcf_type2", "prof2:wcf_type3", "1", "c.f_.")
B = c("2:2", "2:3", "1", "2")


is_num_vec <- function(vec){

# Your solution

}

#### EXPECTED OUTPUT:
 is_num_vec(A)
> [1]  FALSE

 is_num_vec(B)
> [1]  TRUE
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
32
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вот очень простое решение, которое может соответствовать вашей цели:

Сначала удалите : из vec, затем используйте grepl(), чтобы проверить, являются ли все элементы в vec только числами ^[0-9]{1,}$. Используйте all(), чтобы проверить, являются ли все логические значения TRUE.

is_num_vec <- function(vec){
  all(grepl("^[0-9]{1,}$", gsub(":", "", vec)))
}

is_num_vec(A)
[1] FALSE

is_num_vec(B)
[1] TRUE

is_num_vec("5a3")
[1] FALSE

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

rnorouzian 23.03.2022 03:37

В моем подходе несколько двоеточий все еще работают нормально. В подходе @Tim Biegeleisen вернется более 1 двоеточия FALSE

benson23 23.03.2022 03:38

Супер полезно! Бинго

rnorouzian 23.03.2022 03:39

Несколько двоеточий не упоминаются в крайних случаях и не должны рассматриваться здесь.

Tim Biegeleisen 23.03.2022 03:41

Я думаю, что ответ Тима все равно обрабатывает несколько двоеточий, просто попробуйте: A = c("prof2:wcf_type2:C", "prof2:wcf_type3","1","cf"); B = c("2:2:1", "2:3", "1", "2")

rnorouzian 23.03.2022 03:43

@rnorouzian Я имею в виду, что это не работает для чего-то вроде 5235:::::53

benson23 23.03.2022 03:43

О, я вижу, это не то, что ожидается в моем случае. В любом случае спасибо вам обоим.

rnorouzian 23.03.2022 03:44

@Tim Biegeleisen Потому что, когда я думаю о решении, это утверждение: «строковые векторы, кроме «:», состоят только из чисел», первым делом приходит мне на ум, поэтому я сразу думаю о таких случаях, как 5235:::::53

benson23 23.03.2022 03:46

Вот один из базовых подходов с использованием sum() с grepl():

is_num_vec <- function(vec) {
    return(sum(grepl("^\\d+(?::\\d+)*$", vec)) == length(vec))
}

is_num_vec(A)  # [1] FALSE
is_num_vec(B)  # [1] TRUE

Данные:

A <- c("prof2:wcf_type2", "prof2:wcf_type3", "1", "c.f_.")
B <- c("2:2", "2:3", "1", "2")

Мой ответ явно пытается сопоставить 1:2:3..., то есть список чисел, разделенных двоеточиями. В другом ответе удаляется двоеточие, а затем утверждается, что остаются только цифровые символы. Они оба работают, это ваш выбор, что принять.

Tim Biegeleisen 23.03.2022 03:39

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