长度在()聚合中不起作用?

时间:2009-11-23 23:01:08

标签: r aggregate

我有一些我希望由政党和国家描述的调查数据。

我在使用by()聚合命令时遇到了一些麻烦。它适用于许多函数,但不是length()。例如:

by(x, list(party=nn$info$party,state=nn$info$st),mean)

工作正常但不是

by(x, list(party=nn$info$party,state=nn$info$st),length)

返回一个数组,而不是我正在寻找的数据计数,而只是一系列的1。这就是阿拉巴马州的样子:

party: D
state: AL
[1] 1
--------------------------------------------------------------------------- 
party: I
state: AL
[1] 1
--------------------------------------------------------------------------- 
party: R
state: AL
[1] 1
--------------------------------------------------------------------------- 

非常神秘。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

好的,我猜测x是一个数据框。在这种情况下,length返回列数,而不是元素数。您想要nrow。请注意,如果foo是数据框,则按foo$bar获取单个列将返回包含一列的数据框。

> by(1:10, rep(1:5, 2), length)
rep(1:5, 2): 1
[1] 2
------------------------------------------------------------ 
rep(1:5, 2): 2
[1] 2
------------------------------------------------------------ 
rep(1:5, 2): 3
[1] 2
------------------------------------------------------------ 
rep(1:5, 2): 4
[1] 2
------------------------------------------------------------ 
rep(1:5, 2): 5
[1] 2
> by(data.frame(1:10), rep(1:5, 2), length)
rep(1:5, 2): 1
[1] 1
------------------------------------------------------------ 
rep(1:5, 2): 2
[1] 1
------------------------------------------------------------ 
rep(1:5, 2): 3
[1] 1
------------------------------------------------------------ 
rep(1:5, 2): 4
[1] 1
------------------------------------------------------------ 
rep(1:5, 2): 5
[1] 1
> by(data.frame(1:10), rep(1:5, 2), nrow)
rep(1:5, 2): 1
[1] 2
------------------------------------------------------------ 
rep(1:5, 2): 2
[1] 2
------------------------------------------------------------ 
rep(1:5, 2): 3
[1] 2
------------------------------------------------------------ 
rep(1:5, 2): 4
[1] 2
------------------------------------------------------------ 
rep(1:5, 2): 5
[1] 2

答案 1 :(得分:2)

如果您尝试获取不同数据组的记录数,那么最简单的方法通常是使用table。您的帖子中不清楚您要使用哪个数据框 - 是x还是nn$info?考虑到这一点,您的代码应该类似于

with(nn$info, table(party, state=st))

以下是任何人都可以使用Cars93包中的MASS数据集进行复制的示例。

> with(Cars93, table(Type, AirBags))
         AirBags
Type      Driver & Passenger Driver only None
  Compact                  2           9    5
  Large                    4           7    0
  Midsize                  7          11    4
  Small                    0           5   16
  Sporty                   3           8    3
  Van                      0           3    6