能否用dplyr管道将数据框传入table()函数实现季节频率统计?
问题描述
现有如下结构的数据框:
Date X1 .... 2010-01-01 4 2010-01-02 5 2010-01-27 4 2012-03-10 2 ...
已通过hydroTSM包生成名为season的额外列,希望用table()函数统计每日/每月的采样频率(仅关注当日是否有采样,不关心采样值),尝试用dplyr管道实现时出现报错:
尝试的管道代码:
df %>% filter(date >= "2010-01-01") %>% filter(date <= "2010-12-30") %>% table(.$season)
报错信息:
Error in xtrm.data.frame(x) : cannot xtfrm data frames.
若先将过滤后的数据保存为变量再统计则可得到预期结果:
data <- df %>% filter(date >= "2010-01-01") %>% filter(date <= "2010-12-30") %>% as.data.frame(df$date, df$season) table(data$season)
请问能否直接用dplyr管道实现该统计需求?
解决方案
当然可以直接用dplyr管道实现,报错原因是管道最后传递给table()的是整个数据框,table(.$season)的写法无法正确处理数据框输入。以下是几种可行的实现方式:
方法1:用pull()提取目标列后调用table()
pull()可以从数据框中提取指定列转为向量,刚好适配table()的参数要求,代码简洁高效:
df %>% filter(date >= "2010-01-01", date <= "2010-12-30") %>% # 两个过滤条件可合并为一个 pull(season) %>% table()
方法2:用dplyr原生count()函数(贴合tidyverse风格)
如果想要得到数据框格式的统计结果(而非table对象),推荐使用count(),还能自定义频率列的名称:
df %>% filter(date >= "2010-01-01", date <= "2010-12-30") %>% count(season, name = "sample_frequency")
方法3:用with()在数据框环境中调用table()
利用with()让table()直接在过滤后的数据框环境中执行,无需额外提取列:
df %>% filter(date >= "2010-01-01", date <= "2010-12-30") %>% with(table(season))
另外补充:你之前代码里的as.data.frame(df$date, df$season)写法存在隐患,会直接引用原数据框的列而非过滤后的结果,正确写法应该用select()保留需要的列:
data <- df %>% filter(date >= "2010-01-01", date <= "2010-12-30") %>% select(date, season)
内容的提问来源于stack exchange,提问作者Jorge A
相关产品推荐
相关产品推荐

