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

在R数据框中保留在列中包含特定模式的行

  •  2
  • accibio  · 技术社区  · 4 年前

    df 是一个测试数据帧,我只想在其中保留包含 | 性格 Hits 列和包含 击打 (即HIT1、HIT2等)和空白单元 击打

    df <- data.frame(
     Hits = c("# test114", "# ID|987129470", "# 13135", "Hit1", "", "Hit2", "Hit3", "", "# test739", "# ID|6971324987", "# 83771", "Hit1", "Hit2", "", "Hit3"),
     Category1 = c(NA, NA, NA, 0.001, 0.001, 0.002, 0.003, 0.003, NA, NA, NA, 0.023, 0.341, 0.341, 0.569),
     Category2 = c(NA, NA, NA, 100, 100, 99, 98, 98, NA, NA, NA, 100, 95, 95, 97),
     Category3 = c(NA, NA, NA, 100, 100, 99, 98, 98, NA, NA, NA, 98, 97, 97, 92)
    )
    

    df 看起来像这样

    enter image description here

    输出应该是这样的

    enter image description here

    因为我只想保留具有 | 性格和那些没有 # 字符和空白单元格,也许模式匹配可以帮助。但我似乎不知道如何在代码中实现它。有什么建议吗?

    请注意,在原始数据帧中 击打 可以有不同的名字。一些 击打 不要用“Hit”这个词开头

    2 回复  |  直到 4 年前
        1
  •  2
  •   akrun    4 年前

    我们可以用 grep 带有正则表达式模式- "^[^#]+$|\\| (点击专栏,没有 # 从一开始( ^ )结束( $ )或者( | )那个 | 字符-转义为元字符)

    subset(df, grepl("^[^#]+$|\\|", Hits)|Hits == "")
                  Hits Category1 Category2 Category3
    2   # ID|987129470        NA        NA        NA
    4             Hit1     0.001       100       100
    5                      0.001       100       100
    6             Hit2     0.002        99        99
    7             Hit3     0.003        98        98
    8                      0.003        98        98
    10 # ID|6971324987        NA        NA        NA
    12            Hit1     0.023       100        98
    13            Hit2     0.341        95        97
    14                     0.341        95        97
    15            Hit3     0.569        97        92
    

    或者一个人做这个 grepl

    > subset(df, grepl("^$|^[^#]+$|\\|", Hits))
                  Hits Category1 Category2 Category3
    2   # ID|987129470        NA        NA        NA
    4             Hit1     0.001       100       100
    5                      0.001       100       100
    6             Hit2     0.002        99        99
    7             Hit3     0.003        98        98
    8                      0.003        98        98
    10 # ID|6971324987        NA        NA        NA
    12            Hit1     0.023       100        98
    13            Hit2     0.341        95        97
    14                     0.341        95        97
    15            Hit3     0.569        97        92
    

    或者在 dplyr

    library(dplyr)
    library(stringr)
    df %>%
       filter(str_detect(Hits, "^[^#]+$|\\|")|Hits == "")
                 Hits Category1 Category2 Category3
    1   # ID|987129470        NA        NA        NA
    2             Hit1     0.001       100       100
    3                      0.001       100       100
    4             Hit2     0.002        99        99
    5             Hit3     0.003        98        98
    6                      0.003        98        98
    7  # ID|6971324987        NA        NA        NA
    8             Hit1     0.023       100        98
    9             Hit2     0.341        95        97
    10                     0.341        95        97
    11            Hit3     0.569        97        92
    
        2
  •  1
  •   TarJae    4 年前

    与akruns解决方案类似,但不使用正则表达式解决方案:

    library(dplyr)
    library(stringr)
    df %>%
      filter(str_detect(Hits, 'ID|Hit'))
    
                  Hits Category1 Category2 Category3
    1   # ID|987129470        NA        NA        NA
    2             Hit1     0.001       100       100
    3             Hit1     0.001       100       100
    4             Hit2     0.002        99        99
    5             Hit3     0.003        98        98
    6             Hit3     0.003        98        98
    7  # ID|6971324987        NA        NA        NA
    8             Hit1     0.023       100        98
    9             Hit2     0.341        95        97
    10            Hit2     0.341        95        97
    11            Hit3     0.569        97        92
    
        3
  •  1
  •   PaulS    4 年前

    另一种可能的解决方案:

    library(tidyverse)
    
    df %>% 
      filter(!str_detect(Hits,"(?=.*#)(?!.*\\|)"))
    
    #>               Hits Category1 Category2 Category3
    #> 1   # ID|987129470        NA        NA        NA
    #> 2             Hit1     0.001       100       100
    #> 3                      0.001       100       100
    #> 4             Hit2     0.002        99        99
    #> 5             Hit3     0.003        98        98
    #> 6                      0.003        98        98
    #> 7  # ID|6971324987        NA        NA        NA
    #> 8             Hit1     0.023       100        98
    #> 9             Hit2     0.341        95        97
    #> 10                     0.341        95        97
    #> 11            Hit3     0.569        97        92