代码之家  ›  专栏  ›  技术社区  ›  user3115933

如何基于现有数据帧的某一列中使用的特定单词创建新的数据帧?[副本]

  •  0
  • user3115933  · 技术社区  · 5 年前

    我有一个371MB的文本文件,包含microRNA数据。本质上,我只想选择那些有人类microRNA信息的行。

    我用read.table读入了文件。通常,如果sqldf有“like”语法(从miRNA喜欢“hsa”的<gt;where miRNA中选择“*”),我会用它实现我想要的。不幸的是-sqldf不支持该语法。

    我怎么能在R里这么做?我看过stackoverflow,没有看到 如何进行部分字符串匹配 . 我甚至安装了stringr包-但它没有我需要的东西。

    * 被选中。

    selectedRows <- conservedData[, conservedData$miRNA %like% "hsa-"]
    

    当然,这是不正确的语法。

    有人能帮我一下吗?非常感谢你的阅读。

    阿斯达

    0 回复  |  直到 10 年前
        1
  •  136
  •   A5C1D2H2I1M1N2O1R2T1    7 年前

    我注意到你提到了一个函数 %like% 以你目前的方式。我不知道这是不是指 %喜欢%

    注意,对象不必是 data.table (但也要记住 data.frame s和 数据表

    library(data.table)
    mtcars[rownames(mtcars) %like% "Merc", ]
    iris[iris$Species %like% "osa", ]
    

    如果这就是你所拥有的,那么也许你只是混淆了行和列的位置来设置数据。


    如果不想加载包,可以尝试使用 grep() 搜索匹配的字符串。这里有一个例子 mtcars

    mtcars[grep("Merc", rownames(mtcars)), ]
                 mpg cyl  disp  hp drat   wt qsec vs am gear carb
    # Merc 240D   24.4   4 146.7  62 3.69 3.19 20.0  1  0    4    2
    # Merc 230    22.8   4 140.8  95 3.92 3.15 22.9  1  0    4    2
    # Merc 280    19.2   6 167.6 123 3.92 3.44 18.3  1  0    4    4
    # Merc 280C   17.8   6 167.6 123 3.92 3.44 18.9  1  0    4    4
    # Merc 450SE  16.4   8 275.8 180 3.07 4.07 17.4  0  0    3    3
    # Merc 450SL  17.3   8 275.8 180 3.07 3.73 17.6  0  0    3    3
    # Merc 450SLC 15.2   8 275.8 180 3.07 3.78 18.0  0  0    3    3
    

    还有,另一个例子,使用 iris osa :

    irisSubset <- iris[grep("osa", iris$Species), ]
    head(irisSubset)
    #   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    # 1          5.1         3.5          1.4         0.2  setosa
    # 2          4.9         3.0          1.4         0.2  setosa
    # 3          4.7         3.2          1.3         0.2  setosa
    # 4          4.6         3.1          1.5         0.2  setosa
    # 5          5.0         3.6          1.4         0.2  setosa
    # 6          5.4         3.9          1.7         0.4  setosa
    

    对于您的问题,请尝试:

    selectedRows <- conservedData[grep("hsa-", conservedData$miRNA), ]
    
        2
  •  54
  •   mtoto    8 年前

    str_detect() stringr 包,它检测字符串中是否存在模式。

    下面是一个方法,它还包含 %>% 管道和 filter() dplyr 包裹:

    library(stringr)
    library(dplyr)
    
    CO2 %>%
      filter(str_detect(Treatment, "non"))
    
       Plant        Type  Treatment conc uptake
    1    Qn1      Quebec nonchilled   95   16.0
    2    Qn1      Quebec nonchilled  175   30.4
    3    Qn1      Quebec nonchilled  250   34.8
    4    Qn1      Quebec nonchilled  350   37.2
    5    Qn1      Quebec nonchilled  500   35.3
    ...
    

    这将过滤处理变量包含子字符串“non”的行的样本CO2数据集(随R一起提供)。你可以调整 str_detect 查找固定匹配项或使用正则表达式-请参阅stringr包的文档。

        3
  •  20
  •   Sam Firke    9 年前

    LIKE

    require(sqldf)
    df <- data.frame(name = c('bob','robert','peter'),id=c(1,2,3))
    sqldf("select * from df where name LIKE '%er%'")
        name id
    1 robert  2
    2  peter  3