我希望得到以下数据框的计数:
> 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
相信的孩子数量。我会用什么命令来获取它?
(实际的数据框要大得多。我刚给你前四行......)
谢谢!
答案 0 :(得分:37)
您可以使用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
答案 1 :(得分:22)
我认为这是一个两步过程:
根据提供的过滤器对原始数据帧进行子集化 (相信== FALSE);然后
获取此子集的行数
第一步, 子集 功能是一种很好的方法(只是普通索引或括号表示法的替代方法)
第二步,我会使用 dim 或 nrow
使用子集的一个优点:您不必解析它返回的结果以获得所需的结果 - 只需直接调用 nrow 即可。< / p>
所以在你的情况下:
v = nrow(subset(Santa, Believe==FALSE)) # 'subset' returns a data.frame
或包含在匿名函数中:
>> fnx = function(fac, lev){nrow(subset(Santa, fac==lev))}
>> fnx(Believe, TRUE)
3
除了 nrow 之外, dim 也可以完成这项工作。此函数返回数据框(行,列)的维度,因此您只需提供适当的索引即可访问行数:
v = dim(subset(Santa, Believe==FALSE))[1]
在此之前发布的OP的答案显示了列联表的使用。对于OP中所述的一般问题,我不喜欢这种方法。这就是原因。当然,这个数据框中有多少行在C列中具有值x的一般问题?可以使用列联表以及使用“过滤”方案来回答(如我的答案) 。如果您想要给定因子变量(列)的所有值的行计数,那么列联表(通过调用表并传入感兴趣的列)是最明智的解决方案;但是,OP要求在因子变量中计算特定值,而不是在所有值上计数。除了性能损失(可能很大,可能很简单,只取决于数据框的大小和此函数所在的处理管道上下文)。当然,一旦返回表调用的结果,您仍然必须从该结果解析只需要您想要的计数。
这就是为什么,对我来说,这是一个过滤而不是交叉表问题。
答案 2 :(得分:14)
sum(Santa$Believe)
答案 3 :(得分:2)
您可以执行summary(santa$Believe)
,您将获得TRUE
和FALSE
答案 4 :(得分:1)
DPLYR让这很容易。
x<-santa%>%
count(Believe)
如果你想按小组计算;例如,有多少男性与女性相信,只需添加group_by
:
x<-santa%>%
group_by(Gender)%>%
count(Believe)
答案 5 :(得分:0)
带有data.table
的单行解决方案可能是
library(data.table)
setDT(x)[,.N,by=Believe]
Believe N
1: FALSE 1
2: TRUE 3
答案 6 :(得分:0)
使用sqldf
符合以下条件:
library(sqldf)
sqldf("SELECT Believe, Count(1) as N FROM Santa
GROUP BY Believe")