2013-05-02 42 views
0

所以基本上我有數據的格式如下:總結在子集組特定條目(R編程)

ID Value 
1 32 
5 231 
2 122 
1 11 
3 ... 
2 ... 
5 ... 
6 ... 
2 ... 
1 33 
. ... 
. ... 
. ... 

我要總結與ID「1」的值,但在一組5。 ie 在前5條中,有2個條目的ID爲'1',所以我得到總數43, ,然後在接下來的5條中,只有一個條目的ID爲'1',所以我得到33條。 等等... 所以最後我想獲得一個數組與所有的總和,即(433,......)

我可以做到這一點與循環和tapply,但我認爲必須有一個更好的方式在R,不需要一個for循環

任何幫助,非常感謝!非常感謝你!

+0

不要總是以5的倍數值是多少?如果有23行,會發生什麼?只有最後三個分組在一起嗎? – Andrew 2013-05-02 02:05:53

+0

對不起,我應該提到這一點。值不一定是5的倍數。是的,只是最後三個在這種情況下被分組在一起。 – user2341380 2013-05-02 02:09:14

回答

1

做一個新列,以反映的5組:

df = data.frame(
    id = sample(1:5, size=98, replace=TRUE), 
    value = sample(1:98) 
) 
# This gets you a vector of 1,1,1,1, 2,2,2,2,2, 3, ... 
groups = rep(1:(ceiling(nrow(df)/5)), each=5) 
# But it might be longer than the dataframe, so: 
df$group = groups[1:nrow(df)] 

那麼它很容易將各組內獲得的款項:

library(plyr) 
sums = ddply(
    df, 
    .(group, id), 
    function(df_part) { 
    sum(df_part$value) 
    } 
) 

輸出示例:

> head(df) 
    id value group 
1 4 94  1 
2 4 91  1 
3 3 22  1 
4 5 42  1 
5 1 46  1 
6 2 38  2 
> head(sums) 
    group id V1 
1  1 1 46 
2  1 3 22 
3  1 4 185 
4  1 5 42 
5  2 2 55 
6  2 3 158 
+0

謝謝您的回覆,但爲什麼值V1與您的實際值略有不同? 例如在組1中,有兩個ID'1',總和是29 + 35 = 64,但是V1是76 ... – user2341380 2013-05-02 22:26:02

+0

@ user2341380啊,我意外地總結了所有列,而不是僅僅是'value'列。現在應該修好了。示例數據將會不同,因爲我隨機生成它並忘記調用'set.seed()',但它們現在應該匹配。 – Marius 2013-05-02 22:32:41

+0

非常感謝你,但我很想知道你做了什麼確切的錯誤,以便我將來不會做出這樣的事情。所以在你的原始答案中,還包括了什麼? – user2341380 2013-05-02 22:43:08

0

類似這樣的事情可以完成這項工作:

m <- matrix(d$Value, nrow=5) 

# Remove unwanted elements 
m[which(d$ID != 1)] <- 0 

# Fix for short data 
if ((length(d$Value) %/% 5) != 0) 
    m[(length(d$Value)+1):length(m)] <- 0 

# The columns contain the groups of 5 
colSums(m) 
+0

非常感謝您的回覆! – user2341380 2013-05-02 23:46:23

0

如果添加一列劃定組,ddply()可以使用魔法:

ID <- c(1, 5, 2, 1, 3, 2, 5, 6, 2, 1) 
Value <- c(32, 231, 122, 11, 45, 34, 74, 12, 32, 33) 
Group <- rep(seq(100), each=5)[1:length(ID)] 

test.data <- data.frame(ID, Value, Group) 

library(plyr) 
output <- ddply(test.data, .(Group, ID), function(chunk) sum(chunk$Value)) 


> head(test.data) 
    ID Value Group 
1 1 32  1 
2 5 231  1 
3 2 122  1 
4 1 11  1 
5 3 45  1 
6 2 34  2 

> head(output) 
    Group ID V1 
1  1 1 47 
2  1 2 125 
3  1 3 49 
4  1 5 237 
5  2 1 36 
6  2 2 74 
+0

聖潔的廢話。馬呂斯擊敗了我,基本上有同樣的答案。 – Andrew 2013-05-02 02:16:15

+0

他雖然更好。我創建的羣體是一種浪費,並且不適用於更大的表格(除非您將'seq(100)'更改爲更大的表格。) – Andrew 2013-05-02 02:17:29

+1

我認爲相同的答案說明'plyr'爲您提供了多好解決這些問題的模型。這是一件好事。 – Marius 2013-05-02 02:23:12