R中数据框架内元素的数量统计

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

有多少孩子相信。我应该使用什么命令来获取这个信息?

(实际数据框更大。我只是给出了前四行……)

谢谢!

7个回答

41

你可以使用 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 

23

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

  1. 根据提供的筛选条件(Believe == FALSE),对原始数据帧进行子集分割;然后

  2. 获取该子集的行数

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

对于第二步,我会使用 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] 
一个在这之前回答了问题的答主展示了使用一个列联表的方法。我不太喜欢那种方法来解决在问题中提到的一般性问题。理由如下:虽然用一个列联表和一个“过滤”方案(就像我在这里回答的那样)都可以回答一个数据框中在某一列C中有值x的行数;如果你想要给定一个因子变量(列)的所有值的行计数,那么使用一个列联表(通过调用table并传入感兴趣的列)是最明智的解决方案;然而,OP要求对因子变量中的特定值进行计数,而不是跨所有值进行计数。除了性能损失(可能很大,也可能微不足道,取决于数据框的大小和该函数所在的处理管道上下文),当然从调用table返回结果后,仍然需要解析出您想要的计数。所以对我而言,这是一个过滤问题,而不是一个交叉选项问题。

事实上,nrow只是dim的一个包装器。 - Juan

15
sum(Santa$Believe)

我认为这可能是最快的方法。 - Juan
这是针对这个特定情况最快的解决方案,毫无疑问。 - Arani

2

您可以执行summary(santa$Believe),然后您将获得TRUEFALSE的计数。


1
DPLYR 让这变得非常容易。
x<-santa%>%
   count(Believe)

如果您想按组计数,例如有多少男性和女性相信,只需添加一个 group_by
x<-santa%>%
   group_by(Gender)%>%
   count(Believe)

0
一个使用 data.table一行代码 解决方案可能是:
library(data.table)
setDT(x)[,.N,by=Believe]
   Believe N
1:   FALSE 1
2:    TRUE 3

0

在编程中使用sqldf是合适的:

library(sqldf)
sqldf("SELECT Believe, Count(1) as N FROM Santa
       GROUP BY Believe")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接