如何按指定列扩展R语言dataframe并补全缺失值为0
R语言DataFrame全组合扩展实现
原始数据
old <- data.frame( date = c("04/01/2022", "05/01/2022", "07/01/2022", "04/01/2022", "06/01/2022","07/01/2022"), type = c(rep("x", 3), rep("y",3)), name = c("t", "p", "k", "t", "p", "L"), value = c(10,20,30, 9, 5, 8) )
需求说明
需要将上述DataFrame扩展为包含所有date、type、name组合的新DataFrame:
- 为每个日期生成所有type和name的组合
- 原始数据中不存在的
date/type/name组合,对应的value填充为0 - 最终数据维度为
N.date × N.type × N.name
解法一:tidyverse工具链(推荐)
使用tidyr::complete()直接生成全组合并填充缺失值,代码简洁易读:
library(tidyverse) new_df <- old %>% # 生成date、type、name的所有可能组合,缺失value补0 complete(date, type, name, fill = list(value = 0)) %>% # 按目标顺序调整name的排序(可选,匹配示例格式) mutate(name = factor(name, levels = c("t", "p", "k", "L"))) %>% # 按date、type、name排序 arrange(date, type, name)
解法二:Base R实现
无需加载第三方包,通过expand.grid()生成全组合后合并补值:
# 生成所有变量的全组合 all_combinations <- expand.grid( date = unique(old$date), type = unique(old$type), name = unique(old$name), stringsAsFactors = FALSE ) # 左连接原始数据,补全缺失值为0 new_df <- merge(all_combinations, old, by = c("date", "type", "name"), all.x = TRUE) new_df$value[is.na(new_df$value)] <- 0 # 调整顺序匹配目标格式 new_df <- new_df[order(new_df$date, new_df$type, new_df$name), ] row.names(new_df) <- NULL
补充说明
如果需要将value转为字符型(匹配示例中的格式),可添加一行:
new_df$value <- as.character(new_df$value)
内容的提问来源于stack exchange,提问作者Jef van Cappellen
相关产品推荐
相关产品推荐

