在行上进行R循环以找到窗口

时间:2014-06-04 09:21:25

标签: r loops

大家好日子

道歉,我甚至不确定如何把这个!我有一个有4列的SNP数据集(即snp,bta,position,maf)。使用R,如果maf <= 0.01,我需要环/染色体(bta)来识别7个连续SNP的窗口。一旦找到,如果距离&lt; = 300打印该行,则计算第1和第7 SNP(位置i + 6位置i)之间的距离。从第二条染色体开始,跨越所有染色体

snp bta position  maf  
1    1   135098 0.00  
2    1   135198 0.01  
3    1   135200 0.00  
4    1   135220 0.01  
5    1   135225 0.00  
6    1   135230 0.01  
7    1   135235 0.01  
8    1   516404 0.27  
9    1   571340 0.02  
10   1   654413 0.07  
11   1   845494 0.44  
12   1   883895 0.42  
13   1   905632 0.00  
14   1   929617 0.20  
15   1   950841 0.20  
16   1   974586 0.04  
17   2  1078200 0.01  
18   2  1078256 0.00  
19   2  1078280 0.01  
20   2  1078300 0.00  
21   2  1078400 0.00  
22   2  1078410 0.01  
23   2  1078450 0.00 

我希望有类似下面的内容,

snp bta position  maf  
1    1   135098 0.00  
2    1   267940 0.01  
3    1   305793 0.00  
4    1   353745 0.01  
5    1   393248 0.00  
17   2  1009504 0.01  
18   2  1078256 0.00  
19   2  1114422 0.01  
20   2  1189382 0.00  

我将非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

将df data.frame作为提供的数据:

df <- read.table(text=readClipboard(), header=TRUE, stringsAsFactors = F )
r <- rle(df$bta)
df$window <- unlist(lapply(r$lengths, seq_len))

df
   snp bta position  maf window
1    1   1   135098 0.00      1
2    2   1   135198 0.01      2
3    3   1   135200 0.00      3
4    4   1   135220 0.01      4
5    5   1   135225 0.00      5
6    6   1   135230 0.01      6
7    7   1   135235 0.01      7
8    8   1   516404 0.27      8
9    9   1   571340 0.02      9
10  10   1   654413 0.07     10
11  11   1   845494 0.44     11
12  12   1   883895 0.42     12
13  13   1   905632 0.00     13
14  14   1   929617 0.20     14
15  15   1   950841 0.20     15
16  16   1   974586 0.04     16
17  17   2  1078200 0.01      1
18  18   2  1078256 0.00      2
19  19   2  1078280 0.01      3
20  20   2  1078300 0.00      4
21  21   2  1078400 0.00      5
22  22   2  1078410 0.01      6
23  23   2  1078450 0.00      7

library(dplyr)
res <- df %>%
  group_by(bta) %>%
  mutate(dif = position - first(position)) %>%
  filter(maf <= 0.01, dif <= 300, window < 7)

res
Source: local data frame [12 x 6]
Groups: bta

   snp bta position  maf window dif
1    1   1   135098 0.00      1   0
2    2   1   135198 0.01      2 100
3    3   1   135200 0.00      3 102
4    4   1   135220 0.01      4 122
5    5   1   135225 0.00      5 127
6    6   1   135230 0.01      6 132
7   17   2  1078200 0.01      1   0
8   18   2  1078256 0.00      2  56
9   19   2  1078280 0.01      3  80
10  20   2  1078300 0.00      4 100
11  21   2  1078400 0.00      5 200
12  22   2  1078410 0.01      6 210