Я хочу провести логический тест, чтобы различать векторы строк, которые, кроме ":"
, состоят только из чисел (например, вектор 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
Вот очень простое решение, которое может соответствовать вашей цели:
Сначала удалите :
из 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
В моем подходе несколько двоеточий все еще работают нормально. В подходе @Tim Biegeleisen вернется более 1 двоеточия FALSE
Супер полезно! Бинго
Несколько двоеточий не упоминаются в крайних случаях и не должны рассматриваться здесь.
Я думаю, что ответ Тима все равно обрабатывает несколько двоеточий, просто попробуйте: A = c("prof2:wcf_type2:C", "prof2:wcf_type3","1","cf"); B = c("2:2:1", "2:3", "1", "2")
@rnorouzian Я имею в виду, что это не работает для чего-то вроде 5235:::::53
О, я вижу, это не то, что ожидается в моем случае. В любом случае спасибо вам обоим.
@Tim Biegeleisen Потому что, когда я думаю о решении, это утверждение: «строковые векторы, кроме «:», состоят только из чисел», первым делом приходит мне на ум, поэтому я сразу думаю о таких случаях, как 5235:::::53
Вот один из базовых подходов с использованием 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...
, то есть список чисел, разделенных двоеточиями. В другом ответе удаляется двоеточие, а затем утверждается, что остаются только цифровые символы. Они оба работают, это ваш выбор, что принять.
Спасибо вам обоим, я проголосовал за оба, и оба ответа верны. Я хотел бы знать, в чем разница между двумя подходами, чтобы я мог принять один из них.