我有一个数据框,我有一个我要搜索的ID列表,以检查它们是否在该数据帧中。这个数据框看起来像这样:
dput(bed,"mybed.bed")
sample <- c("13874.p1", "13609.p1","12736.p1", "11970.p1","12025.p1","12189.p1","12529.p1","11522.p1","11716.p1","13684.p1")
我想返回数据框的行,其中包含sample
向量和df$sample_ID
共享的任何一个值。
我尝试使用sapply(samples, grepl, df$sample_ID)
,但只有在检查样本的第一个元素时才会出现。任何帮助,将不胜感激!!
答案 0 :(得分:1)
致电:
unique(do.call(c, sapply(X = sample, FUN = function(x){return(grep(pattern = x,x = df$sample_id) )})))
应该有效:
> df = data.frame(chrom = c(1,2,1,1),
+ sample_id = c("12613.p1", "12613.p1","11118.p1,11120.p1,11199.p1,11226.p1,11285.p1,11296.p1,11333.p1,11374.p1,11388.p1,11395.p1,11420.p1", "11401.p1,13863.p1"),
+ stringsAsFactors = F)
>
>
>
> sample <- c("13874.p1", "13609.p1","12736.p1", "11970.p1","12025.p1",
+ "12189.p1","12529.p1","11522.p1","11716.p1","13684.p1")
>
>
> unique(do.call(c, sapply(X = sample, FUN = function(x) {return(grep(pattern = x,x = df$sample_id) )})))
integer(0)
没有解决方案
但是如果我在样本中添加最后一个字符串:
> sample <- c("13874.p1", "13609.p1","12736.p1", "11970.p1","12025.p1",
+ "12189.p1","12529.p1","11522.p1","11716.p1","13684.p1",
+ "11199.p1")
>
>
> unique(do.call(c, sapply(X = sample, FUN = function(x){return(grep(pattern = x,x = df$sample_id) )})))
[1] 3
它有效!!
答案 1 :(得分:0)
我认为我使用str_locate_all
包中的stringr
获得了解决方案。例如:
v <- c("abc11", "abc11abc11", "abc11abc11abc11abc")
library(stringr)
result1 <- str_locate_all(v[1], "11")
result2 <- str_locate_all(v[2], "11")
result3 <- str_locate_all(v[3], "11")
输出将显示每个匹配的一行,其中一对值为start-end(匹配):
> result1
[[1]]
start end
[1,] 4 5
> result2
[[1]]
start end
[1,] 4 5
[2,] 9 10
> result3
[[1]]
start end
[1,] 4 5
[2,] 9 10
[3,] 14 15
>
结果存储在一个不舒服的结构中:
> class(result3)
[1] "list"
> length(result3)
[1] 1
>
这个唯一元素是一个整数矩阵:
> class(result3[[1]])
[1] "matrix"
> dim(result3[[1]])
[1] 3 2
>
函数str_locate
提供了更简单的输出,但它只能找到第一个匹配。
我的建议是提取列表的第一个元素,然后使用它,例如:
m <- result3[[1]]
不能更容易地访问存储为result3
的矩阵3x2的信息:
> m
start end
[1,] 4 5
[2,] 9 10
[3,] 14 15
现在,要知道比赛的数量:
> nrow(m)
[1] 3
或dim(m)[1]
。
因此,以矩阵形式存储的结果更容易提取信息。要获取输入参数上的所有匹配位置,只需提取第一列:
> m[,1]
[1] 4 9 14
--------------------------------------------------------------------------------
修改强>
将先前的概念应用于原始问题,即在n值数组中找到m模式数组的匹配。
--------------------------------------------------------------------------------
回到我理解的问题,让我们说我们有以下数据框架:
df = data.frame(ID = c(1,2,3,4),
sample_ID = c(
"12613.p1",
"12613.p1",
"11401.p1,11120.p1,11199.p1,11226.p1,11395.p1,11296.p1,11333.p1,11374.p1,11388.p1,11395.p1,11420.p1",
"11401.p1,13863.p1"),
stringsAsFactors = F)
现在我们有以下示例向量:
sample <- c("11120.p1", "11395.p1", "12613.p1", "13863.p1", "11401.p1")
df
有4行,sample
数组有5行。现在根据前面的解释,我们可以使用df$sample_ID
函数在sample
中搜索lapply
的元素:
library(stringr)
all <- sapply(df$sample_ID, FUN = function(x) {return(str_locate_all(x, sample))})
现在输出将是:
> class(all)
[1] "matrix"
,其中
> dim(all)
[1] 5 4
因此,对于sample
的每个元素,我们有5列,其结果来自df$sample_ID
(四列)的给定行。
我们希望sample
的每个元素符合以下条件:
Sample | df$sample_ID[1] | df$sample_ID[2] | df$sample_ID[3] | df$sample_ID[4]
------- | -----------------|------------------|-----------------|---------------
11120.p1 | 0 | 0 | 1 | 0
11395.p1 | 0 | 0 | 2 | 0
12613.p1 | 1 | 1 | 0 | 0
13863.p1 | 0 | 0 | 0 | 1
11401.p1 | 1 | 0 | 1 | 0
这是获得的结果:
> all
12613.p1 12613.p1
[1,] Integer,0 Integer,0
[2,] Integer,0 Integer,0
[3,] Integer,2 Integer,2
[4,] Integer,0 Integer,0
[5,] Integer,0 Integer,0
11401.p1,11120.p1,11199.p1,11226.p1,11395.p1,11296.p1,11333.p1,11374.p1,11388.p1,11395.p1,11420.p1
[1,] Integer,2
[2,] Integer,4
[3,] Integer,0
[4,] Integer,0
[5,] Integer,2
11401.p1,13863.p1
[1,] Integer,0
[2,] Integer,0
[3,] Integer,0
[4,] Integer,2
[5,] Integer,2
>
矩阵的每个元素都是list
。以下是了解结果的方法,对于每个[row, col]
,它提供了有关list
元素的摘要信息:Integer,n
将指示给定单元格的元素数量。对于每个匹配,我们有两个值:{start
,end
],因此对于m匹配,我们将有m x 2
。这就是为什么[row, col] = [2,3]
的值为4
。
要提取信息,请说明我们所拥有的第三行(sample[2]=11395.p1
)的值匹配:df$sample_ID[3]
:
> all[2,3]
$`11401.p1,11120.p1,11199.p1,11226.p1,11395.p1,11296.p1,11333.p1,11374.p1,11388.p1,11395.p1,11420.p1`
start end
[1,] 37 44
[2,] 82 89
提取所有匹配位置:
> all[2,3][[1]][,1]
[1] 37 82
例如:m <- all[2,3][[1]]
然后:
> m[,1]
[1] 37 82
如何识别不匹配条件?
让我们选择原始矩阵的元素[1,1]
,其中没有匹配,然后:
> m <- all[1,1][[1]]
> dim(m)
[1] 0 2
> dim(m)[1]
[1] 0
>
我希望现在能解决您的具体问题。
答案 2 :(得分:0)
我想我找到了一个解决这个问题的简单方法(对于没有发布更真实的数据而道歉,我的数据集非常庞大)。
所以我有一个ID字符向量sample
。然后我有一个表,其中一列包含每行的ID列表。
hits <- c()
for(i in sample){
hits <- append(hits, which(grepl(i, df$sample_ID, fixed = TRUE)))
}
hits2 <- unique(hits)
我只需浏览sample
向量,每次检查每个df $ sample_ID列表中是否存在它。它返回每个正命中的行号(来自数据帧)。由于某些行可能有2个匹配项,因此我删除重复项。
然后我可以根据这些行进行子集化。
df2 <- df[hits2,]