【问题标题】:Select columns based on string values in column content根据列内容中的字符串值选择列
【发布时间】:2021-06-22 14:01:50
【问题描述】:

我有一个 tibble,只想选择那些至少包含一个与正则表达式匹配的值的列。我花了一段时间才弄清楚如何做到这一点,所以我在这里分享我的解决方案。

我的用例:我只想从像下面这样的小标题中选择那些包含媒体文件名的列。重要的是,我不提前知道 tibble 包含哪些列,以及是否有任何列包含媒体文件名。

condition picture sound video description
A cat.png meow.mp3 cat.mp4 A cat
A dog.png woof.mp3 dog.mp4 A dog
B NA NA NA NA
B bird.png tjirp.mp3 tjirp.mp4 A bird

重现tibble的R代码:

dat = structure(list(condition = c("A", "A", "B", "B"), picture = c("cat.png", 
"dog.png", NA, "bird.png"), sound = c("meow.mp3", "woof.mp3", 
NA, "tjirp.mp3"), video = c("cat.mp4", "dog.mp4", NA, "tjirp.mp4"
), description = c("A cat", "A dog", NA, "A bird")), row.names = c(NA, 
-4L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

    标签: r select dplyr tidyverse


    【解决方案1】:

    解决方案:

    > dat %>% select_if(~any(grepl("\\.png|\\.mp3|\\.mp4", .)))
    # A tibble: 4 x 3
      picture  sound     video    
      <chr>    <chr>     <chr>    
    1 cat.png  meow.mp3  cat.mp4  
    2 dog.png  woof.mp3  dog.mp4  
    3 NA       NA        NA       
    4 bird.png tjirp.mp3 tjirp.mp4
    

    【讨论】:

    • select_if 不再使用。试试dat %&gt;% select(where(~ any(grepl("\\.(png|mp3|mp4)$", .)))) 或(基础R):Filter(function(x) any(grepl("\\.(png|mp3|mp4)$", x)), dat)
    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2023-03-25
    • 2021-11-24
    相关资源
    最近更新 更多