选择列匹配模式,然后只保留与其他矢量值匹配的行

时间:2018-01-24 06:23:37

标签: r dplyr data.table pattern-matching

我想在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

任何建议表示赞赏!谢谢!

1 个答案:

答案 0 :(得分:2)

我们可以使用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。通过链接,我们需要提取&#39; flux_1&#39;柱

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