用grep对观测值进行反滤波

用grep对观测值进行反滤波,r,data.table,R,Data.table,如下图所示: 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 <- 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_b您可能对
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

您确定要使用
grep
而不是%
中的
%吗?此外,如果您需要
grep
方法,您可能需要查看
grepl
。此外,为什么要在此处加载“data.table”?执行
!ind
在控制台中,您将看到为什么该表达式返回空的
data.frame
。您好,我使用“data.table”,因为我的原始数据集很大,我想使用data.table来操作我的数据集。我稍微修改了一下我的问题。我只是想知道为什么我在
data.table
中的逻辑不正确。感谢you@nrussell让我非常惊讶的是,所有的
都是假的
!ind
。我意识到
grep
返回数字索引,但是
!ind
是一个逻辑运算符,它永远不会给我想要的东西。我需要改用
grepl
。非常感谢你的提示!非常感谢你!它与
grepl
一起工作。表
喜欢使用逻辑模式而不是数字索引来识别观察结果。我会投票给你的答案。@ChuanTang,你总是可以做
df[setdiff(seq_len(nrow(df)),ind)]
。但是这比仅仅使用
grepl
@ChuanTang要麻烦得多。在这种情况下,逻辑索引有好处,因为%
中的
%有一些优化。另外,对于字符向量,
%chin%
通常建议使用
%in%
(出于某种原因…)。
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
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