29

我正在寻找以下数据框的计数:

> Santa
   Believe Age Gender Presents Behaviour
1    FALSE   9   male       25   naughty
2     TRUE   5   male       20      nice
3     TRUE   4 female       30      nice
4     TRUE   4   male       34   naughty

相信的孩子的数量。我会用什么命令来得到这个?

(实际的数据框要大得多。我刚刚给了你前四行......)

谢谢!

4

7 回答 7

40

你可以使用table

R> x <- read.table(textConnection('
   Believe Age Gender Presents Behaviour
1    FALSE   9   male       25   naughty
2     TRUE   5   male       20      nice
3     TRUE   4 female       30      nice
4     TRUE   4   male       34   naughty'
), header=TRUE)

R> table(x$Believe)

FALSE  TRUE 
    1     3 
于 2009-11-28T19:57:34.033 回答
23

我认为这是一个两步过程:

  1. 根据提供的过滤器对原始数据帧进行子集化(相信==假);然后

  2. 获取此子集的行数

对于第一步,子集函数是一个很好的方法(只是普通索引或括号符号的替代)。

对于第二步,我会使用dimnrow

使用subset的一个优点:您不必解析它返回的结果来获得您需要的结果——只需直接调用nrow即可。

所以在你的情况下:

v = nrow(subset(Santa, Believe==FALSE))     # 'subset' returns a data.frame

或包裹在匿名函数中:

>> fnx = function(fac, lev){nrow(subset(Santa, fac==lev))}

>> fnx(Believe, TRUE)
      3

除了nrowdim也可以完成这项工作。此函数返回数据框的维度(行、列),因此您只需提供适当的索引即可访问行数:

v = dim(subset(Santa, Believe==FALSE))[1] 

在此之前发布的 OP 的答案显示了列联表的使用。对于 OP 中所述的一般问题,我不喜欢这种方法。这就是原因。当然,这个数据框中有多少行在列 C 中有值 x 的一般问题?可以使用列联表以及“过滤”方案来回答(如我在此处的回答)。如果您想要给定因子变量(列)的所有值的行数,那么列联表(通过调用并传入感兴趣的列)是最明智的解决方案;但是,OP 要求计算特定的因子变量中的值,不计入所有值。除了性能损失(可能很大,可能微不足道,仅取决于数据帧的大小和此函数所在的处理管道上下文)。当然,一旦返回对 table 的调用的结果,您仍然必须从该结果中解析出您想要的计数。

所以这就是为什么,对我来说,这是一个过滤而不是交叉表问题。

于 2009-11-29T16:51:40.453 回答
15
sum(Santa$Believe)
于 2009-11-28T20:04:11.383 回答
2

你可以做summary(santa$Believe),你会得到计数TRUEFALSE

于 2016-03-16T17:01:09.543 回答
1

DPLYR 让这变得非常简单。

x<-santa%>%
   count(Believe)

如果您想按组计数;例如,有多少男性和女性相信,只需添加一个group_by

x<-santa%>%
   group_by(Gender)%>%
   count(Believe)
于 2017-06-21T12:01:50.327 回答
0

单线解决方案data.table可能是

library(data.table)
setDT(x)[,.N,by=Believe]
   Believe N
1:   FALSE 1
2:    TRUE 3
于 2018-09-08T04:22:49.703 回答
0

在这里使用sqldf适合:

library(sqldf)
sqldf("SELECT Believe, Count(1) as N FROM Santa
       GROUP BY Believe")
于 2019-05-05T05:54:10.950 回答