0

所以基本上我有这种数据格式:

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

我想总结 ID 为“1”的值,但在一组 5 中。即在前 5 个条目中,有 2 个 ID 为“1”的条目,所以我得到一个总和 43,然后在接下来的 5条目,只有一个条目的 ID 为“1”,所以我得到 33。依此类推......所以最后我想得到一个包含所有总和的数组,即 (43,33,......)

我可以用for循环和tapply来做,但我认为R中一定有更好的方法不需要for循环

任何帮助深表感谢!非常感谢!

4

3 回答 3

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
于 2013-05-02T02:09:30.603 回答
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)
于 2013-05-02T02:10:44.823 回答
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
于 2013-05-02T02:15:18.077 回答