如何让dplyr返回数值而非数据框?常见疑问及解决方案
关于dplyr计算结果类型的问题解答
我来帮你拆解这些困扰你的dplyr细节问题:
a. 代码a的运行逻辑与L的含义
代码a <- flights %>% filter(carrier == "AA") %>% length()能返回数值,是因为length()函数作用在数据框(tibble)上时,会返回数据框的列数——你筛选出的AA航班数据正好有19列,所以得到结果19L。
后面的L是R里的特殊标记,用来表示这个数值是整数(integer)类型,而非R默认的浮点数(numeric)。如果是无L的19则代表浮点数,19L会明确告诉R这是一个整数类型的值。
b. 代码b失败的原因
mean()函数和length()的处理逻辑完全不同:length()可以直接接受数据框作为参数(返回列数),但mean()的设计目标是计算向量的均值,它无法直接处理整个数据框。当你把filter后的tibble传给mean()时,函数不知道该计算哪一列的均值,因此会抛出错误。
c. 将summarise结果转为数值的方法
summarise()的返回结果永远是tibble(哪怕只有一个值),要把它转成单纯的数值,有几种实用方法:
- 用dplyr的
pull()函数提取单列向量,再计算均值(最符合dplyr链式代码的风格) - 从summarise的结果里直接提取值,比如
c[[1]]或者c$mean(hour)``
优化后的解决方案
最简洁的链式写法就是用pull()先提取出hour列的向量,再计算均值:
mean_hour <- flights %>% filter(carrier == "AA") %>% pull(hour) %>% mean()
pull()的核心作用就是从tibble中提取单列数据,将其转为普通向量,这样mean()就能正常计算了。
内容的提问来源于stack exchange,提问作者Tomas R
相关产品推荐
相关产品推荐

