我如何通过匹配列名中特定位置的多个模式来创建子集?
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_locate
和 which
到 select 列的组合。如果您有一个搜索词列表,则可以使用 paste0
将它们折叠到一个列表中。然后,我们可以在特定位置(即 11
和 12
)和 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
使用 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_locate
和 which
到 select 列的组合。如果您有一个搜索词列表,则可以使用 paste0
将它们折叠到一个列表中。然后,我们可以在特定位置(即 11
和 12
)和 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