【问题标题】:! grep in R - finding items that do not match [duplicate]! R中的grep - 查找不匹配的项目[重复]
【发布时间】:2015-01-22 10:08:53
【问题描述】:

我想在数据框中查找与模式不匹配的行。

 Key = c(1,2,3,4,5)
 Code = c("X348","I605","B777","I609","F123")
 df1 <- data.frame(Key, Code)

我可以使用以下方法找到以 I60 开头的项目:

 df2 <- subset (df1, grepl("^I60", df1$Code))

但我希望能够找到所有其他行(即那些不以 I60 开头的行)。 invert 参数不适用于 grepl。 grep 本身不会找到所有行,也无法将结果传递给子集命令。感谢您的帮助。

【问题讨论】:

  • subset(df1, !grepl("^I60", Code))
  • 不确定grep 不起作用是什么意思。 df1[grep("^I60", df1$Code, invert = TRUE), ]df1[-grep("^I60", df1$Code), ] 似乎工作正常。我也不明白为什么有人会使用subset。它总是让我想起人们出于某种原因必须使用plyr 的奇怪冲动。
  • 公平点,只是(坏)习惯,但我是 R 新手。感谢您的 cmets,感谢。
  • 赞成在那里使用'invert' - 由于某种原因,在使用 grep 时该标志已经逃脱了我。整洁的。与管道结合以排除多个对象时也能很好地工作。例如 df1[grep("^I60|^F123", df1$Code, invert=TRUE, ]

标签: r


【解决方案1】:

你可以使用[ 操作符来做

df1[!grepl("I60", Code),]

(@Hugh 建议澄清:)另一种方法是

df1[!grepl("I60",df1$Code),]

这里是数组索引的参考手册,用[完成:

http://cran.r-project.org/doc/manuals/R-intro.html#Array-indexing

【讨论】:

  • +1 但请注意 ,Code 仅有效,因为该变量是独立于数据框创建的。 (如果Code 不是环境中的对象,而只是一个列名,则此代码将不起作用——尽管只需要稍作修改。)
  • 就像@Hugh 所说,这不适用于真实的数据集,更不用说这里的两个答案早就在 cmets 中提供了。
  • 是的,感谢您的简化。我必须更多地使用 [ 运算符!
【解决方案2】:

另外,你可以试试这个:

 Key = c(1,2,3,4,5)
Code = c("X348","I605","B777","I609","F123")
df1 <- data.frame(Key, Code)
toRemove<-grep("^I60", df1$Code)
df2 <- df1[-toRemove,]

【讨论】:

  • JFY,使用which(grepl)和只使用grep是一样的
  • 这个答案给出了正确的答案,但不应被接受,因为它不必要地复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2015-11-22
  • 2020-02-13
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多