2016-03-02 21 views
-1

我有一系列的数字是0或1.总长度是35115或如果你采取35115/15你有2341块。我想遍历每个块,看看我的向量tmp是否与包含块的感兴趣列匹配。我想沿着我的数据框seq,但采取步骤15,问这15个匹配我的载体。 我在做什么错?有人能帮我吗?谢谢大家教我一些有用的东西。干杯用于循环采取步骤15和匹配矢量到数据帧列

x; 
     V1  V2 V3 V4 V5 V6 V7 
3R 11024348 A G A1 0 61 
3R 11024348 A G A2 1 30 
3R 11024348 A G A3 0 68 
3R 11024348 A G A4 0 57 
3R 11024348 A G A5 0 63 
3R 11024348 A G A6 0 49 
3R 11024348 A G A7 0 60 
3R 11024348 A G B1 0 63 
3R 11024348 A G B2 0 64 
3R 11024348 A G B3 0 71 
3R 11024348 A G B4 1 51 
3R 11024348 A G B5 0 37 
3R 11024348 A G B6 0 52 
3R 11024348 A G B7 0 47 
3R 11024348 A G AB8 0 83 
3R 11024410 C T A1 0 45 
3R 11024410 C T A2 1 54 
3R 11024410 C T A3 0 76 
3R 11024410 C T A4 0 48 
3R 11024410 C T A5 0 49 
3R 11024410 C T A6 1 48 
3R 11024410 C T A7 0 45 
3R 11024410 C T B1 0 48 
3R 11024410 C T B2 0 81 
3R 11024410 C T B3 1 58 
3R 11024410 C T B4 1 50 
3R 11024410 C T B5 0 65 
3R 11024410 C T B6 1 45 
3R 11024410 C T B7 0 66 
3R 11024410 C T AB8 0 58 


tmp<-c(1,1,0,1,1,1,1,1,1,1,1,1,0,0,0) 
for(i in seq(from=1, to=length(X$V6), by=15)){print(matchID<-match(tmp,X$V6[i]))} 
+0

请提供一个最小的重复的例子,一个循环。 – Roland

+0

Roland任何数据都可以工作,但这里只是真实数据的一小部分。我想按照步骤15将x $ V6与tmp匹配。这里有两个步骤。 – Genetics

+0

为什么这会得到负面评价?我提供了一个具体的需求问题和一个循环的例子,我无法工作? – Genetics

回答

1

如果你真的想用一个for loop,你需要为了存储定义数据结构的循环结果(可能是数字,字符串,列表,矩阵等的向量)。

matchID<-vector()

让我们来看看你的代码:

for(i in seq(from=1, to=length(X$V6), by=15)){print(matchID<-match(tmp,X$V6[i]))} 

你的函数调用15(TMP的长度)从1到30(V6的长度)跳一个循环,所以它是否会返回:

>for(i in seq(1,30,15)) print(i) 
[1] 1 
[1] 16 

所以如果你指数i您的V6载体,循环只会在1返回值和16

这里是我的解决方案:

matchID<-vector() # stores the loop return in a vector 
for(i in 1:length(x[, "V6"]){ 
    matchID[i]<- as.numeric(tmp == x[, "V6"])[i] 
} 

你可以看到,我元素matchID,它总是等于在向量与温度和“V6”的个元素。

不过,你真的不需要在这种情况下

matchID<-as.numeric(tmp == x[, "V6"]) 
+0

感谢迈克,这是一个巨大的帮助。我有一个关于如何做到这一点的思考过程,并得到3个答案。 – Genetics

1

我不能完全肯定就预期的输出,但也许这:

首先再现数据:

x <- read.table(text = "  V1  V2 V3 V4 V5 V6 V7 
3R 11024348 A G A1 0 61 
       3R 11024348 A G A2 1 30 
       3R 11024348 A G A3 0 68 
       3R 11024348 A G A4 0 57 
       3R 11024348 A G A5 0 63 
       3R 11024348 A G A6 0 49 
       3R 11024348 A G A7 0 60 
       3R 11024348 A G B1 0 63 
       3R 11024348 A G B2 0 64 
       3R 11024348 A G B3 0 71 
       3R 11024348 A G B4 1 51 
       3R 11024348 A G B5 0 37 
       3R 11024348 A G B6 0 52 
       3R 11024348 A G B7 0 47 
       3R 11024348 A G AB8 0 83 
       3R 11024410 C T A1 0 45 
       3R 11024410 C T A2 1 54 
       3R 11024410 C T A3 0 76 
       3R 11024410 C T A4 0 48 
       3R 11024410 C T A5 0 49 
       3R 11024410 C T A6 1 48 
       3R 11024410 C T A7 0 45 
       3R 11024410 C T B1 0 48 
       3R 11024410 C T B2 0 81 
       3R 11024410 C T B3 1 58 
       3R 11024410 C T B4 1 50 
       3R 11024410 C T B5 0 65 
       3R 11024410 C T B6 1 45 
       3R 11024410 C T B7 0 66 
       3R 11024410 C T AB8 0 58", header = TRUE) 

tmp<-c(1,1,0,1,1,1,1,1,1,1,1,1,0,0,0) 

现在使用整数除法来定义块,然后用aggregate或您选择的“拆分应用组合”功能:

aggregate(x$V6, list(block = (seq_len(nrow(x)) - 1) %/% 15), FUN = function(v) all(v == tmp)) 
# block  x 
#1  0 FALSE 
#2  1 FALSE 

个大概更快的替代方案将是您的data.frame的列转换成一个矩阵,这样做:

colSums(matrix(x$V6, nrow = 15) == tmp) == 15L 
#[1] FALSE FALSE 
+0

嗨罗兰,这是一个很好的方式来做我想问的问题,我甚至没有考虑过。怎么样forloop?我问,因为它困扰我,我无法掌握forloop的数字。 – Genetics

+0

我不明白你用'print'和'match'做了什么,但基本思想是你需要计算索引,即'i + 0:14'。 – Roland

+0

嗨,罗兰,我不太习惯聚合函数。如果您确实发现了匹配,那么可以通过一种简单的方法来逆转课程并在数据框中提取匹配项? – Genetics