2016-11-24 62 views
-1

我有這個數據,我想三個行的組合,1-3,4-6,7-9,10-12。在我的數據框中,我有48行和795個變量。你可以幫幫我嗎?我怎樣才能以三個一組對行進行求和?

我的數據幀:

 X1  X2  X3  X4  X5  X6  X7  X8  X9  
1  0.00  0.00 136.29 0.00 60.52 0.00  0.00 0.00 0.00 
2  0.00  0.00 4658.69 0.00 0.00 1749.50  0.00 0.00 0.00 
3  0.00  0.00 0.00 0.00 0.00 125.86  0.00 0.00 0.00 
4  0.00  0.00 119.34 0.00 0.00 0.00  0.00 0.00 0.00 
5  0.00  0.00 4674.16 2107.55 0.00 0.00  0.00 0.00 0.00 
6  0.00  0.00 0.00 0.00 0.00 5689.40  0.00 0.00 0.00 
7 4270.87  0.00 0.00 0.00 0.00 3275.74  0.00 0.00 0.00 
8  0.00 455.04 0.00 0.00 0.00 1296.30  0.00 0.00 0.00 
9  0.00  0.00 0.00 0.00 0.00 9887.52  0.00 0.00 0.00 
10 0.00  0.00 0.00 0.00 0.00 0.00  0.00 0.00 0.00 
11 0.00  0.00 0.00 0.00 2169.64 0.00  0.00 0.00 699.93 
12 0.00 12524.50 0.00 0.00 0.00 0.00  0.00 0.00 0.00 

這是我想要的:

 X1  X2  X3  X4  X5  X6  X7  X8  X9 
1  0.00  0.00 ...... 
2  0.00  0.00 ...... 
3 4270.87 455.04 ...... 
4  0.00 12524.50 ...... 
+2

還參見'rowsum' - 'rowsum(數據,appropriate_grouping_vector) ' –

+1

@alexis_laz不錯的一個,太簡單了! 'rowsum(df1,rep(1:4,each = 3))',考慮張貼爲答案。 – zx8754

+0

@alexis_laz - 該死的......我總是忘記'rowsum' - 一個比我的更好的解決方案。 – thelatemail

回答

4

使用filter基礎R溶液(這是stats::filter - 這dplyr bulldozes如果已經加載 - 提防):

data.frame(lapply(df, function(x) filter(x, c(1,1,1), sides=1)[seq(3, nrow(df), 3)])) 
#  X1  X2  X3  X4  X5  X6 X7 X8  X9 
#1 0.00  0.00 4794.98 0.00 60.52 1875.36 0 0 0.00 
#2 0.00  0.00 4793.50 2107.55 0.00 5689.40 0 0 0.00 
#3 4270.87 455.04 0.00 0.00 0.00 14459.56 0 0 0.00 
#4 0.00 12524.50 0.00 0.00 2169.64  0.00 0 0 699.93 

如@alexis_laz以上?rowsum筆記可能是優選的,因爲它爲它被明確定義目的,形式如下:

rowsum(data, appropriate_grouping_vector) 

所以,像這樣的東西:

關於正行個
rowsum(dat, (1:nrow(dat) - 1) %/% 3) 
#  X1  X2  X3  X4  X5  X6 X7 X8  X9 
#0 0.00  0.00 4794.98 0.00 60.52 1875.36 0 0 0.00 
#1 0.00  0.00 4793.50 2107.55 0.00 5689.40 0 0 0.00 
#2 4270.87 455.04 0.00 0.00 0.00 14459.56 0 0 0.00 
#3 0.00 12524.50 0.00 0.00 2169.64  0.00 0 0 699.93 
1

下面的代碼是一個dplyr溶液從其源(Summing columns on every nth row of a data frame in R)改性。

它通過創建一個索引變量來對行進行分組,然後將這些子集行的rowsums解決。 n可以取任何值,前提條件是nrow(df)可以被n整除。

df <- data.frame(runif(30), runif(30), runif(30)) 
library(plyr); library(dplyr) 

n <- 3 

df %>% 
    group_by(indx = gl(ceiling(nrow(df)/n), n, nrow(df))) %>% 
    summarise_each(funs(sum)) 
0

拆分數據,然後求和:

# dummy data 
df1 <- mtcars[1:12, 1:6] 

# split sum combine 
t(sapply(split(df1, rep(1:4, each = 3)), colSums)) 
0

這也將工作:

df$group <- ceiling((1:nrow(df))/3) 
aggregate(. ~ group, data = df, sum)[-1] 

     X1  X2  X3  X4  X5  X6 X7 X8  X9 
1 0.00  0.00 4794.98 0.00 60.52 1875.36 0 0 0.00 
2 0.00  0.00 4793.50 2107.55 0.00 5689.40 0 0 0.00 
3 4270.87 455.04 0.00 0.00 0.00 14459.56 0 0 0.00 
4 0.00 12524.50 0.00 0.00 2169.64  0.00 0 0 699.93