【问题标题】:Select column matching pattern then keep only rows that match other vector values选择列匹配模式,然后只保留与其他向量值匹配的行
【发布时间】:2018-01-24 06:23:36
【问题描述】:

我想选择DT1 中与模式flux 匹配的列,然后只保留与预定义向量vec1 中的值相似的行

样本数据

library(data.table)

DT1 <- structure(list(flux_1 = c(1, 6, 2, 9, 5),
                  FileName = c("prac_1", "prac_2", "prac_3", "prac_4", "prac_5")), 
             .Names = c("flux_1", "FileName"), 
             class = c("data.table", "data.frame"), 
             row.names = c(NA, -5L))
DT1

    flux_1 FileName
1:      1   prac_1
2:      6   prac_2
3:      2   prac_3
4:      9   prac_4
5:      5   prac_5

vec1 <- c(6, 2)

以下代码有效,但我需要明确指定flux_1。

DT1[ flux_1 %in% vec1]

   flux_1 FileName
1:      6   prac_2
2:      2   prac_3

我在想这样的事情,但没有成功

DT1[, .SD, .SDcols = names(DT1) %like% "flux"] %>% 
  .[. %in% vec1]

Empty data.table (0 rows) of 1 col: flux_1

感谢任何建议!谢谢!

【问题讨论】:

    标签: r dplyr data.table pattern-matching


    【解决方案1】:

    我们可以使用get来返回grep之后列的值

    DT1[get(grep('flux', names(DT1), value = TRUE)) %in% vec1 ]
    #  flux_1 FileName
    #1:      6   prac_2
    #2:      2   prac_3
    

    或者,如果我们使用.SDcols 路由,将.SD 提取为vector 进行比较并对数据集进行子集化

    DT1[DT1[, .SD[[1]] %in% vec1, .SDcols = grep('flux', names(DT1))]]
    

    %like%可以使用类似的选项

    DT1[DT1[, .SD[[1]] %in% vec1, .SDcols = names(DT1) %like% "flux"]]
    

    关于 OP 的方法

    DT1[, .SD, .SDcols = names(DT1) %like% "flux"]
    #   flux_1
    #1:      1
    #2:      6
    #3:      2
    #4:      9
    #5:      5
    

    返回带有单列的data.table。通过链接,我们需要提取 'flux_1' 列

    DT1[, .SD, .SDcols = names(DT1) %like% "flux"] %>% 
            .[[1]] %in% vec1 %>%
            magrittr::extract(DT1, .)
    #   flux_1 FileName
    #1:      6   prac_2
    #2:      2   prac_3
    

    【讨论】:

    • 那是闪电般的速度!感谢您的帮助!
    • 它越来越好。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多