R - grep 删除大写行

gia*_*iac 3 regex r

我想删除所有包含大写单词的行。

我的数据如下所示:

                                      dt
1        TRAVEL AND UNSPECIFIED TIME USE
2                      TRAVEL BY PURPOSE
3 Travel related to unspecified time use
4    Travel related to personal business
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这不起作用

dt[-c(grep('[A-Z]', dt$dt)) , ] 
Run Code Online (Sandbox Code Playgroud)

因为,奇怪的是,当我生成这样的随机数据时它会起作用mtcars

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

有人能帮我吗 ?

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)
Run Code Online (Sandbox Code Playgroud)

akr*_*run 7

除了资金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
Run Code Online (Sandbox Code Playgroud)

在 OP 的另一个示例“l”中,每个字符串只有一个字符。因此,使用[A-Z]作品,但最好不要使用-. 例如,假设我们有一个所有元素都是小写的向量

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

作为

grep("^[A-Z]+$", v1)
#integer(0)
Run Code Online (Sandbox Code Playgroud)

但是,否定 ( !) 将获得预期的输出

 v1[!grepl("^[A-Z]+$", v1)]
 #[1] "a"  "aB" "b" 
Run Code Online (Sandbox Code Playgroud)