【问题标题】:Using grep to help subset a data frame使用 grep 帮助子集数据框
【发布时间】:2014-02-14 04:34:36
【问题描述】:

我在对数据进行子集化时遇到问题。我希望在 x 列上对数据进行子集化,其中前 3 个字符以 G45 开头。

我的数据框:

x <- c("G448", "G459", "G479", "G406")  
y <- c(1:4)
My.Data <- data.frame (x,y)

我试过了:

subset (My.Data, x=="G45*")

但我不确定如何使用通配符。我也尝试过 grep() 来查找索引:

grep  ("G45*", My.Data$x)

但它返回所有 4 行,而不仅仅是那些以 G45 开头的行,可能也是因为我不确定如何使用通配符。

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    您也可以使用stringr

    library(dplyr)
    library(stringr)
    My.Data %>% filter(str_detect(x, '^G45'))
    

    这种情况下你不能使用'^'(开头)来获取你需要的结果

    【讨论】:

      【解决方案2】:

      使用[ 提取非常简单:

      grep 将为您提供与您的搜索模式匹配的位置(除非您使用value = TRUE)。

      grep("^G45", My.Data$x)
      # [1] 2
      

      由于您在单个列的值中进行搜索,这实际上对应于行索引。因此,将其与[ 一起使用(您将使用My.Data[rows, cols] 来获取特定的行和列)。

      My.Data[grep("^G45", My.Data$x), ]
      #      x y
      # 2 G459 2
      

      subset 的帮助页面显示了如何将grepgreplsubset 一起使用,如果您更喜欢使用此功能而不是[。这是一个例子。

      subset(My.Data, grepl("^G45", My.Data$x))
      #      x y
      # 2 G459 2
      

      从 R 3.3 开始,现在还有 startsWith 函数,您可以再次将其与 subset 一起使用(或与上述任何其他方法一起使用)。根据该函数的帮助页面,它比使用substringgrepl 快得多。

      subset(My.Data, startsWith(as.character(x), "G45"))
      #      x y
      # 2 G459 2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 2017-09-04
        • 1970-01-01
        相关资源
        最近更新 更多