2013-11-22 54 views
1

我需要讀取CSV文件,其中沒有標題並且列數和行數未知。但是,每隔一列都屬於一個矩陣,而下一個列需要位於不同的矩陣中。例如將CSV中的每隔一列轉換爲R中的交替矩陣

CSV輸入:

1,2,3,4 
1,2,3,4 
1,2,3,4 
1,2,3,4 

期望的結果將相當於:

matrix1 <- (c(1, 3, 
       1, 3, 
       1, 3, 
       1, 3), NumberOfRows, NumberOfColumns, byrow=T); 

matrix2 <- (c(2, 4, 
       2, 4, 
       2, 4, 
       2, 4), NumberOfRows, NumberOfColumns, byrow=T); 

我已經試過這樣的事情(但這似乎過於複雜和反正不起作用)。在R中沒有簡單的方法來做到這一點?

mydata<- read.csv("~/Desktop/file.csv", header=FALSE, nrows=4000); 
columnCount<-ncol(mydata); 
rowCount<-nrow(mydata); 
evenColumns <- matrix(); oddColumns <-matrix(); 

for (i in 1:columnCount) { 
    if (i %% 2) { 
    for (l in 1:rowCount){ 
     col <- 1; 
     evenColumns[col, l] <-mydata[i,l]; 
     col<-col+1; 
    } 
    } 
    else { 
    for (l in 1:rowCount){ 
     col <-1; 
     oddColumns[col, l] <-mydata[i,l]; 
     col<-col+1; 
    } 
    } 
} 

這應該如何在R中正確完成?

回答

2

您可以seq得到列數:

full = read.csv("mat.csv", header=FALSE) 

odds = as.matrix(full[, seq(1, ncol(full), by=2)]) 
evens = as.matrix(full[, seq(2, ncol(full), by=2)]) 

輸出:

> odds 
    V1 V3 
[1,] 1 3 
[2,] 1 3 
[3,] 1 3 
[4,] 1 3 
> evens 
    V2 V4 
[1,] 2 4 
[2,] 2 4 
[3,] 2 4 
[4,] 2 4 
+0

完美!這工作,並不難理解。 – Brent

2

類似問題的討論here

mat.even <- mydata[,which(1:ncol(mydata) %% 2 == 0)] 
mat.odd <- mydata[,which(1:ncol(mydata) %% 2 == 1)] 
+1

甚至'dat [seq_along(dat)%% 2 == 1]' – thelatemail

+0

非常好!這工作。教我一種新的方法(哪個)。 – Brent

1

每隔開始第一:

> cdat[ , c(TRUE,FALSE)] 
    V1 V3 
1 1 3 
2 1 3 
3 1 3 
4 1 3 

每隔開始與第二:

> cdat[ , !c(TRUE,FALSE)] 
    V2 V4 
1 2 4 
2 2 4 
3 2 4 
4 2 4