用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