我如何通过匹配列名中特定位置的多个模式来创建子集?

How would I create a subset by matching multiple patterns at a specific location in column names?

使用 dput 的示例代码:

df <- structure(list
          (TCGA.OR.A5JP.01A = c(0.0980697379293791, NA, NA,0.883701102465278, 0.920634671107133), 
               TCGA.OR.A5JG.01A = c(0.909142796219422, NA, NA, 0.870551482839855, 0.9170243029211), 
               TCGA.PK.A5HB.01A = c(0.860316269591325, NA, NA, 0.283919878689488, 0.92350756003924), 
               TCGA.OR.A5JE.01A = c(0.288860652773179,NA, NA, 0.831906751819423, 0.913890036560933), 
               TCGA.OR.A5KU.01A = c(0.0897293436489091,NA, NA, 0.166760246036103, 0.920367435681197)), 
          row.names = c("cg00000029","cg00000108", "cg00000109", "cg00000165", "cg00000236"), 
          class = "data.frame")

我想创建一个保留列的子集,它只包含位置 11 和 12 的特定模式(我计算了“.”)。例如,TCGA.OR.A5xx.01A 中的“x”。我有该职位的多个 codes/patterns 列表(例如,“JG”、“HB”、“KU”)。

我试过:

df_subset <- subset(df, select=grepl("JG|HB|KU",names(df)))

但它不是特定于位置的,并且包括恰好包含这些模式的列。

我还有第二个问题 - 我可以用模式列表以某种方式做到这一点吗?我在列表中放入了 30 多种模式,我想知道我是否可以使用该列表而不是再次输入它们。

我们可以使用 str_locatewhich 到 select 列的组合。如果您有一个搜索词列表,则可以使用 paste0 将它们折叠到一个列表中。然后,我们可以在特定位置(即 1112)和 select 这些列找到搜索词。

library(tidyverse)

key_chr <- c("JG", "HB", "KU")
search_terms <- paste0(key_chr, collapse = "|")

df %>% 
  select(which(str_locate(names(df), search_terms)[,1] == 11 & str_locate(names(df), search_terms)[,2] == 12))

或者在 base R 中,我们可以将其写为:

df <- df[, which(regexpr(search_terms, names(df)) == 11)]

输出

           TCGA.OR.A5JG.01A TCGA.PK.A5HB.01A TCGA.OR.A5KU.01A
cg00000029        0.9091428        0.8603163       0.08972934
cg00000108               NA               NA               NA
cg00000109               NA               NA               NA
cg00000165        0.8705515        0.2839199       0.16676025
cg00000236        0.9170243        0.9235076       0.92036744

另一种不依赖正则表达式的方法可能是:

subset(df, select = substring(names(df), 11,12) %in% c("JG", "HB", "KU"))

##>            TCGA.OR.A5JG.01A TCGA.PK.A5HB.01A TCGA.OR.A5KU.01A
##> cg00000029        0.9091428        0.8603163       0.08972934
##> cg00000108               NA               NA               NA
##> cg00000109               NA               NA               NA
##> cg00000165        0.8705515        0.2839199       0.16676025
##> cg00000236        0.9170243        0.9235076       0.92036744