R - 逐行迭代csv文件,以5为一组求和

时间:2012-06-22 16:07:49

标签: r csv row infinite-loop

我有一个使用尺寸为130,395的read.csv()创建的数据结构。我试图逐行迭代数据并返回一个包含每行总和列表列表的向量,增量为5 (仅来自数据[,13:395])。我编写了下面的代码,但它返回一个向量,其中按列的间隔为5,它也是一个无限循环。换句话说,我试图想象如何使这个代码有限并逐行工作。

data <- read.csv(file = "Table.csv")
indexes <- c(13:395)
counter <- 0
a <- c()
list <- c()

for(line in data){
    for(index in indexes){
        while(counter<5){
            a <- c(a, line[index])
            counter = counter + 1
            }
        list <- c(list, sum(a, na.rm = TRUE))
        counter = 0
        a = c()
        }
    }

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

这个怎么样?

library(zoo)
d <- as.data.frame(matrix(1:100,nrow = 4))
> t(apply(d,1,function(x) { rollapply(x,width = 5,FUN = "mean",align = "left") }))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,]    9   13   17   21   25   29   33   37   41    45    49    53    57    61    65    69    73    77    81    85
[2,]   10   14   18   22   26   30   34   38   42    46    50    54    58    62    66    70    74    78    82    86
[3,]   11   15   19   23   27   31   35   39   43    47    51    55    59    63    67    71    75    79    83    87
[4,]   12   16   20   24   28   32   36   40   44    48    52    56    60    64    68    72    76    80    84    88
     [,21]
[1,]    89
[2,]    90
[3,]    91
[4,]    92

出于您的目的,您只会传递13:365列(例如d[,13:365]而非d)。

我现在看到错误地使用了mean代替sum,但这种改变很容易实现。

答案 1 :(得分:0)

你是否意味着这样的意思:

lapply(1:nrow(data),function(i) rowSums(data[i:min(i+5,nrow(data)),13:395]))

使用内置数据集的初始结果是:

 head(lapply(1:nrow(mtcars),function(i) rowSums(mtcars[i:min(i+5,nrow(mtcars)),])))
[[1]]
        Mazda RX4     Mazda RX4 Wag        Datsun 710    Hornet 4 Drive 
          328.980           329.795           259.580           426.135 
Hornet Sportabout           Valiant 
          590.310           385.540 

[[2]]
    Mazda RX4 Wag        Datsun 710    Hornet 4 Drive Hornet Sportabout 
          329.795           259.580           426.135           590.310 
          Valiant        Duster 360 
          385.540           656.920 

[[3]]
       Datsun 710    Hornet 4 Drive Hornet Sportabout           Valiant 
          259.580           426.135           590.310           385.540 
       Duster 360         Merc 240D 
          656.920           270.980 

[[4]]
   Hornet 4 Drive Hornet Sportabout           Valiant        Duster 360 
          426.135           590.310           385.540           656.920 
        Merc 240D          Merc 230 
          270.980           299.570 

[[5]]
Hornet Sportabout           Valiant        Duster 360         Merc 240D 
           590.31            385.54            656.92            270.98 
         Merc 230          Merc 280 
           299.57            350.46 

[[6]]
   Valiant Duster 360  Merc 240D   Merc 230   Merc 280  Merc 280C 
    385.54     656.92     270.98     299.57     350.46     349.66