将CSV中的每个其他列读取到R中的交替矩阵中

时间:2013-11-22 00:28:02

标签: r csv matrix

我需要读取一个没有标题且列数和行数未知的CSV文件。但是,每个其他列属于一个矩阵,而下一个列需要位于不同的矩阵中。示例

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中正确完成?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

与讨论的问题类似here

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

答案 2 :(得分: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