2013-05-02 79 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