我有一个使用尺寸为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()
}
}
感谢您的帮助
答案 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