如下所示:
df <- data.frame(X1 = rep(letters[1:3],3),
X2 = 1:9,
X3 = sample(1:50,9))
df
ind<- grep("a|c", df$X1)
library(data.table)
df_ac <- df[ind,]
df_b <- df[!ind,]
df_ac
是使用常规grep
命令创建的。如果我想以相反的方式使用grep
:用X1 == 'b'
选择所有观察结果。
我知道我可以这样做:
ind2<- grep("a|c", df$X1, invert = T)
df_b <-df[ind2,]
但是,在我的原始脚本中,为什么命令df_b <-df[!ind,]
返回没有观察的数据帧?
任何人都可以向我解释为什么我的逻辑错了?有没有其他方法可以反向使用grep
而不指定invert = T
来选择data.frame中的观察结果?谢谢!
答案 0 :(得分:2)
您可能对grepl
而不是grep
更感兴趣:
ind<- grepl("a|c", df$X1)
df[ind,]
# X1 X2 X3
# 1 a 1 16
# 3 c 3 38
# 4 a 4 10
# 6 c 6 18
# 7 a 7 33
# 9 c 9 49
df[!ind,]
# X1 X2 X3
# 2 b 2 5
# 5 b 5 14
# 8 b 8 50
或者,继续使用“data.table”并尝试%in%
以查看其他可能对您有用的内容。请注意语法上的差异。
ind2 <- c("a", "c")
library(data.table)
setDT(df)
df[X1 %in% ind2]
# X1 X2 X3
# 1: a 1 16
# 2: c 3 38
# 3: a 4 10
# 4: c 6 18
# 5: a 7 33
# 6: c 9 49
df[!X1 %in% ind2]
# X1 X2 X3
# 1: b 2 5
# 2: b 5 14
# 3: b 8 50