R语言新手求助:基于年份与类别列统计值列非缺失频次
嗨~作为R新手碰到这种数据整理的需求太正常了,我来帮你一步步实现想要的结果!
首先咱们先把示例数据整理成数据框(方便后续操作),顺便加个随机种子让结果可重复:
set.seed(123) # 固定随机数,让每次运行结果一致 RANDOM <- sample(c("A","B","C","D"), size = 100, replace = TRUE) Year <- sample(c(2008,2009,2010), 100, TRUE) Value <- sample(c(0.22, NA), 100, TRUE) df <- data.frame(Ticker = RANDOM, Year, Value) # 提前把RANDOM改名为Ticker,更贴合你的需求
接下来推荐用tidyverse工具包来处理,代码直观易懂,适合新手:
library(tidyverse) # 核心步骤:过滤非缺失值 → 分组计数 → 转成宽格式表格 result <- df %>% filter(!is.na(Value)) %>% # 只保留Value不为空的行 count(Ticker, Year) %>% # 按Ticker和年份统计数量 pivot_wider( names_from = Year, # 把Year列的内容作为新列名 values_from = n, # 把计数结果n对应到新列里 values_fill = "" # 没有数据的单元格填空字符串,想要0的话改成0就行 )
运行后你就能得到和你想要的格式完全一致的结果啦,示例输出大概是这样:
| Ticker | 2008 | 2009 | 2010 |
|---|---|---|---|
| A | 9 | 11 | 7 |
| B | 11 | 2 | 6 |
| C | 8 | 5 | 9 |
| D | 7 | 6 | 8 |
如果你不想装额外的包,用基础R也能实现:
# 先统计非缺失值的交叉表 count_table <- table(df$Ticker[!is.na(df$Value)], df$Year[!is.na(df$Value)]) # 转成数据框 result_base <- as.data.frame.matrix(count_table) # 把0换成空字符串(如果不需要的话可以跳过这步) result_base[result_base == 0] <- ""
两种方法都能达到你的需求,推荐先用tidyverse的方式,代码逻辑更清晰,后续调整也方便~
内容的提问来源于stack exchange,提问作者bli12blu12
相关产品推荐
相关产品推荐

