我认为这是一个两步过程:
根据提供的过滤器对原始数据帧进行子集化
(相信==错误);那么
获取该子集的行数
对于第一步,subset 函数是一个很好的方法(只是普通索引或 括号 符号的替代) .
对于第二步,我会使用 dim 或 nrow
使用 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
除了 nrow,dim 也可以完成这项工作。此函数返回数据框(行、列)的维度,因此您只需提供适当的索引即可访问行数:
v = dim(subset(Santa, Believe==FALSE))[1]
在此之前发布的 OP 的答案显示了列联表的使用。对于 OP 中所述的一般问题,我不喜欢这种方法。这就是原因。当然,这个数据框中有多少行在 C 列中有 x 值?这个一般问题可以使用列联表以及“过滤”方案来回答(如我在此处的回答) .如果您想要给定因子变量(列)的所有值的行数,那么列联表(通过调用 table 并传入感兴趣的列)是最明智的解决方案;但是,OP 要求计算因子变量中的 特定 值,而不是计算所有值。除了性能损失(可能很大,也可能微不足道,仅取决于数据帧的大小和该函数所在的处理管道上下文)。当然,一旦返回对 table 的调用的结果,您仍然必须从该结果中 parse 只是您想要的计数。
这就是为什么,对我来说,这是一个过滤而不是交叉表问题。