在R

时间:2017-02-18 17:58:09

标签: r

我有一个数据框,我有一个我要搜索的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),但只有在检查样本的第一个元素时才会出现。任何帮助,将不胜感激!!

3 个答案:

答案 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将指示给定单元格的元素数量。对于每个匹配,我们有两个值:{startend],因此对于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,]