在R

时间:2016-03-18 18:04:19

标签: 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_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中的观察结果?谢谢!

1 个答案:

答案 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