我想删除所有包含大写单词的行。
我的数据如下所示:
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)
除了资金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)