2016-08-21 66 views
1

我試圖合併每第n行數據幀中的值。 的數據結構如下所示:每x行合併數據幀

id value 
1 1 
2 2 
3 1 
4 2 
5 3 
6 4 
7 1 
8 2 
9 4 
10 4 
11 2 
12 1 

我喜歡聚集的值對每個每4行。實際上,數據集描述了每個4天期間的測量。

ID 「1」= DAY1,
ID 「2」= DAY2,
ID 「3」=第3天,
ID 「4」=第四天,
ID 「5」= DAY1,
。 ...

因此,可以使用從1到4循環中的列進行計數?

結果應該看起來像(和):

day sum 
1 8 
2 10 
3 4 
4 5 

回答

3

這可以用%%創建分組變量,然後實現做sumaggregate

n <- 4 
aggregate(value ~cbind(day = (seq_along(df1$id)-1) %% n + 1), df1, FUN = sum) 
# day value 
#1 1  8 
#2 2 10 
#3 3  4 
#4 4  5 

這種方法也可以與dplyr/data.table

library(dplyr) 
df1 %>% 
    group_by(day = (seq_along(id)-1) %% 4 +1) %>% 
     summarise(value = sum(value)) 
#  day value 
# <dbl> <int> 
#1  1  8 
#2  2 10 
#3  3  4 
#4  4  5 

setDT(df1)[, .(value = sum(value)), .(day = (seq_along(id) - 1) %% 4 + 1)] 
# day value 
#1: 1  8 
#2: 2 10 
#3: 3  4 
#4: 4  5 
+0

它看起來不錯,但我不知道爲什麼從'結果sum(colSums(matrix(df1 $ value,nrow = 4)))'返回另一個值? – JohnnyDeer

+0

@JohnnyDeer因爲'矩陣(df1 $ value,nrow = 4)'是創建第1個4值,然後是下一個4值的列,所以你需要'rowSums'即'rowSums(矩陣(df1 $ value,nrow = 4))# [1] 8 10 4 5'但是,這種方法**只適用於當列的長度是4的倍數。 – akrun

+1

好吧,我明白了:) – JohnnyDeer

1

您需要創建一個序列,

rep(1:4, length = nrow(df)) 
## [1] 1 2 3 4 1 2 3 4 1 2 3 4 

aggregate

aggregate(value ~ cbind(day = rep(1:4, length = nrow(df))), df, FUN = sum) 

## day value 
## 1 1  8 
## 2 2 10 
## 3 3  4 
## 4 4  5 

或dplyr:

library(dplyr) 

df %>% group_by(day = rep(1:4, length = n())) %>% summarise(sum = sum(value)) 

## # A tibble: 4 x 2 
##  day sum 
## <int> <int> 
## 1  1  8 
## 2  2 10 
## 3  3  4 
## 4  4  5 

或data.table:

library(data.table) 

setDT(df)[, .(sum = sum(value)), by = .(day = rep(1:4, length = nrow(df)))] 

## day sum 
## 1: 1 8 
## 2: 2 10 
## 3: 3 4 
## 4: 4 5