2016-03-02 19 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