в R, пытаясь опустить пустой набор в индексации - PullRequest
0 голосов
/ 01 марта 2012

функция дает мне вектор строк, и я хочу удалить те записи, которые "не очень хорошо выглядят".

> area
[1] "US_GAF_15"  "den helder"

вторая не "хорошо выглядит" - вторая, географическаяназвание, а не код местоположения.Я описываю географические названия как имена, содержащие строчные буквы.

>   area <- area[-grep("[a-z]", area)]

, это не работает, если в наборе нет географического названия.

> -grep("[a-z]", area)
integer(0)
> area[-grep("[a-z]", area)]
character(0)

Я знаю, что могу это сделатьпоместив выделение за простой if, но вы видите другой способ сделать это.Я надеюсь быть удивленным неожиданным стилем программирования.

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Используйте grepl вместо grep, поскольку он возвращает логический вектор.

area <- area[!grepl("[a-z]", area)]

Редактировать: это идемпотент, как вы его описали.Сравните:

cleanArea <- function(x, pattern="[a-z]"){
  x[!grepl(pattern, x)]
}

> cleanArea(c("US_GAF_15", "den helder"))
[1] "US_GAF_15"

> cleanArea(c("US_GAF_15"))
[1] "US_GAF_15"

> cleanArea(c("den Helder"))
character(0)

> cleanArea(NULL)
NULL

> cleanArea(character(0))
character(0)
0 голосов
/ 01 марта 2012

Используйте grepl с subset:

subset(area, !grepl("[a-z]", area) )

Менее компактный и менее читаемый будет:

area[ ! area %in% grep("[a-z]", area, value=TRUE) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...