2013-08-02 76 views
2

一環接合數據我有兩個同樣長的數據集 - 「vpXmin」和「vpXmax」從「副總裁」通過「rbind」與R

> head(vpXmin) 
       vp 
[1,] 253641 2621722 
[2,] 253641 2622722 
[3,] 253641 2623722 
[4,] 253641 2624722 
[5,] 253641 2625722 
[6,] 253641 2626722 

> head(vpXmax) 
       vp 
[1,] 268641 2621722 
[2,] 268641 2622722 
[3,] 268641 2623722 
[4,] 268641 2624722 
[5,] 268641 2625722 
[6,] 268641 2626722 

我想加入的每個從這些行的創建數據集使用'rbind'並且想要創建單獨的矩陣;例如

l1<-rbind(vpXmax[1,],vpXmin[1,]) 
l2<-rbind(vpXmax[2,],vpXmin[2,]) 
... ... 

即使我不熟悉有R循環,我要對付這樣的大數據作爲一個循環......但在嘗試此我失敗:

for (i in 1:length(vp)){rbind(vpXmax[i,],vpXmin[i,])} 

知道爲什麼?另外,請給我一些很好的參考,以便學習使用R的不同類型的循環,如果有的話。提前致謝。

+0

你可以張貼dput的'輸出(頭(vpXmax))'和'dput(頭(vpXmin) )'。另外,你是否想爲每個*行分開一個矩陣?請張貼你想要的輸出樣本以避免模棱兩可。 – A5C1D2H2I1M1N2O1R2T1

+0

當你說「我失敗了......」時,請準確描述發生了什麼!你收到錯誤信息了嗎?我注意到的第一件事就是你並沒有將'rbind'的結果賦值給一個變量:它看起來像你的循環將執行所有的計算,但是會拋棄結果。 –

+0

for循環中出現什麼錯誤?您需要在每個循環中進行分配,例如'l [[i]] < - rbind(vpXmax [i,],vpXmin [i,])''。請注意,for循環不是通常或慣用的方式來執行您似乎正在做的事情。 – Hugh

回答

0

也許是這樣的:

vpXmax <- matrix(1:10,ncol=2) 
vpXmin <- matrix(11:20,ncol=2) 

l <- lapply(1:nrow(vpXmin),function(i) rbind(vpXmax[i,],vpXmin[i,])) 

然後,而不是l1l2等等等等,你有

l[[1]] 
#  [,1] [,2] 
#[1,] 1 6 
#[2,] 11 16 
l[[2]] 
#  [,1] [,2] 
#[1,] 2 7 
#[2,] 12 17 

雖然它可能是不理想的,有一個重大的事情錯了與你的初始循環。 您沒有分配您的輸出,因此您需要以某種方式使用assign<-來實際製作對象。但是,使用assign幾乎是一個標誌,可以提醒您有更好的方法來做事情,並且<-需要預先分配或其他填充。 然而,它會工作,雖然污染你的工作空間l1l2 ... ln對象:

for (i in 1:nrow(vpXmax)) {assign(paste0("l",i), rbind(vpXmax[i,],vpXmin[i,]))} 

> l1 
#  [,1] [,2] 
#[1,] 1 6 
#[2,] 11 16 

> l2 
#  [,1] [,2] 
#[1,] 2 7 
#[2,] 12 17 
+0

謝謝,但我最終的目標是使這些對象中的每一個都成爲空間線。所以我用「lapply」這樣做:L1 <-lapply(1:length(l),function(i)Line(l [[i]]))... Ls1 <-lapply(1:length( L1),函數(i)行(列表(L1 [[i]]),ID =「a」))... SL1 <-lapply(1:length(Ls1),function(i)SpatialLines Ls1 [[i]])))...但我不能在繪圖(繪圖(SL1))之前取消列出SL1(類:空間線)以避免錯誤:'x'是一個列表,但沒有組件'x'和'y'。 – ToNoY

0

正如@ToNoy所指出的那樣,您想要的輸出類型並不明顯。最簡單的方法是創建一個列表,其中每個元素是兩個原始數據幀中每行的rbind的結果。

A <- data.frame("a" = runif(100, -1, 0), "b" = runif(100, 0, 1))                              
Z <- data.frame("a" = runif(100, -2, -1), "b" = runif(100, 1, 2))                              

output <- vector("list", nrow(A))                                      
for (i in 1:nrow(A)) {                                        
    output[[i]] <- rbind(A[i, ], Z[i, ])                                    
}