数据汇总在r

时间:2013-01-23 15:57:45

标签: r

我有一个数据集(测试)

v1 v2  v3  v4  v5  v6
1   1   1   0   0   0 
2   2   1   1   0   0 
3   2   1   0   0   0 
4   3   1   0   0   0 
5   3   1   1   0   1 
6   3   1   0   1   1 

structure(list(V1 = 1:6, V2 = c(1L, 2L, 2L, 3L, 3L, 3L), V3 = c(1L, 
1L, 1L, 1L, 1L, 1L), V4 = c(0L, 1L, 0L, 0L, 1L, 0L), V5 = c(0L, 
0L, 0L, 0L, 0L, 1L), V6 = c(0L, 0L, 0L, 0L, 1L, 1L)), .Names = c("V1", 
"V2", "V3", "V4", "V5", "V6"), class = "data.frame", row.names = c(NA, 
-6L))

我希望实现这个

v1  v2  v3  v4  v5  v6
 1   1   1   0   0   0  
 5   2   2   1   0   0  
15   3   3   1   1   2  

我试过这个:

aggregate(test[c('v3', 'v4', 'v5','v6')], list('v2'), FUN=sum, na.rm=TRUE)

哪个不行。我想基于V2聚合(测试)中的数据并将其他变量相加。

2 个答案:

答案 0 :(得分:6)

aggregate命令更改为:

aggregate(. ~ V2, test, sum)
#   V2 V1 V3 V4 V5 V6
# 1  1  1  1  0  0  0
# 2  2  5  2  1  0  0
# 3  3 15  3  1  1  2

有些注意事项:

  1. R区分大小写。您提供的示例数据具有以大写“V”命名的变量,但您尝试过的示例代码具有小写“v”。
  2. 您正试图直接引用变量名称。为此,您需要使用aggregate()的公式表示法,或者您需要使用with()或(不推荐)attach()

答案 1 :(得分:1)

您最初的尝试几乎是正确的。通过微小的校正,您可以实现您想要的。这假设您希望按V2汇总行和

result <- aggregate(test[,c('V1', 'V3', 'V4', 'V5','V6')], list(test[,'V2']), FUN=sum, na.rm=TRUE)

> names(result) <- gsub("Group.1", "V2", names(result))
> result
  V2 V1 V3 V4 V5 V6
1  1  1  1  0  0  0
2  2  5  2  1  0  0
3  3 15  3  1  1  2