如何统计data.frame中Class各取值在不同Date的出现次数(含0值)
这里有两种实用的方法来生成包含所有class-date组合(包括未出现时的0值)的计数表,刚好匹配你要的输出格式:
方法1:使用tidyverse工具链(推荐,代码更直观)
首先确保你已经安装并加载了tidyverse包(它包含了dplyr和tidyr,处理这类数据非常方便):
# 安装包(如果还没装的话) install.packages("tidyverse") library(tidyverse) # 你的原始数据框 df <- data.frame(class = c("a","b","a","a"), date = c(2010,2009,2010,2009)) # 生成目标输出 result <- df %>% # 先扩展出所有class和date的可能组合 expand(class = unique(class), date = unique(date)) %>% # 左连接原数据的计数结果 left_join(df %>% count(class, date, name = "volume"), by = c("class", "date")) %>% # 把缺失的volume填充为0 mutate(volume = replace_na(volume, 0)) # 查看结果 print(result)
运行后你会得到完全符合预期的输出:
class date volume 1 a 2009 1 2 a 2010 2 3 b 2009 1 4 b 2010 0
方法2:使用Base R(无需额外安装包)
如果你不想加载第三方包,用base R的table()函数也能实现:
# 你的原始数据框 df <- data.frame(class = c("a","b","a","a"), date = c(2010,2009,2010,2009)) # 生成交叉表并转换为数据框 tab <- as.data.frame(table(df$class, df$date)) # 重命名列名 colnames(tab) <- c("class", "date", "volume") # 查看结果 print(tab)
这个方法会自动生成所有组合,未出现的组合计数就是0,输出和上面的结果一致。
内容的提问来源于stack exchange,提问作者Nathalie
相关产品推荐
相关产品推荐

