2016-09-29 2 views
2

Я хотел бы удалить все строки, содержащие слова UPPERCASE.R - grep удалить строки в верхнем регистре

Мои данные выглядит следующим образом:

         dt 
1  TRAVEL AND UNSPECIFIED TIME USE 
2      TRAVEL BY PURPOSE 
3 Travel related to unspecified time use 
4 Travel related to personal business 

Я не понимаю, почему это не работает

dt[-c(grep('[A-Z]', dt$dt)) , ] 

Потому что, как ни странно это работает, когда я генерировать случайные данные на mtcars, как это:

l = sample(c(letters[1:16], LETTERS[1:16])) 
mtcars$code = l 
mtcars[-c(grep('[A-Z]', mtcars$code)) , ] 

Может кто-нибудь мне помочь?

dt = c("TRAVEL AND UNSPECIFIED TIME USE", 
"TRAVEL BY PURPOSE", 
"Travel related to unspecified time use", 
"Travel related to personal business") 
dt = as.data.frame(dt) 
dt$dt = as.character(dt$dt) 

ответ

3

В дополнение к капиталу letteres, есть место, так что мы можем соответствовать один или несколько заглавных букв, включая пространство ([A-Z ]+) от начала (^) от строки до конца ($) в grepl, и свести на нет (!), чтобы вернуть элементы, которые включают в себя нижний или нижний регистр с верхним регистром (смешанные) или все другие возможности.

dt[!grepl("^[A-Z ]+$",dt$dt),, drop = FALSE] 
#         dt 
#3 Travel related to unspecified time use 
#4 Travel related to personal business 

В другом примере ОП в «л», есть только один символ в строке. Таким образом, используя [A-Z] работает, однако, лучше не использовать -. Например, предположим, что у нас есть вектор со всеми элементами в нижнем регистре

v1 <- c('a', 'aB', 'b') 
v1[-grep("^[A-Z]+$", v1)] 
#character(0) 

как

grep("^[A-Z]+$", v1) 
#integer(0) 

Однако, отрицая (!) получит ожидаемый результат

v1[!grepl("^[A-Z]+$", v1)] 
#[1] "a" "aB" "b" 
+0

Отрицание не работает. Но все остальное да. – giacomo

+0

@giacomoV Это 'grepl', а не' grep'. – akrun

+1

aaaaaaaaaaaaaaaah! Спасибо ! супер. – giacomo

Смежные вопросы