在R语言中如何添加前置列含NA值的行?
在R中补全日期-分类的缺失行(含NA值)
我来帮你搞定这个问题——你需要确保每个日期都对应所有分类(Accounts)的行,哪怕这些行的Balances原本是NA或者根本不存在。下面给你几种简单可行的方法,按需选择就行:
先补全你的原始数据代码
首先把你没写完的代码补全,方便后续操作:
Accounts <- c('A','B','C','D', 'A','B','C','D', 'A','B','C','D') Dates <- as.Date(c('2016-01-31', '2016-01-31','2016-01-31','2016-01-31', '2016-02-28','2016-02-28','2016-02-28','2016-02-28', '2016-03-31','2016-03-31','2016-03-31','2016-03-31')) Balances <- c(100,NA,NA,NA, 90,50,10,NA, 80,40,5,120) Origination <- data.frame(Dates,Accounts,Balances)
方法1:用tidyverse(最直观易读)
如果你习惯用tidyverse生态,这个方法友好又好懂:
- 先安装加载tidyverse包(没装过的话执行这步)
install.packages("tidyverse") library(tidyverse)
- 生成所有日期和分类的完整组合,再和原始数据关联
# 提取所有唯一的日期和分类 all_dates <- unique(Origination$Dates) all_accounts <- unique(Origination$Accounts) # 生成日期×分类的笛卡尔积(所有可能的组合) full_combinations <- expand_grid(Dates = all_dates, Accounts = all_accounts) # 左连接原始数据,自动填充缺失的Balances为NA Origination_full <- full_combinations %>% left_join(Origination, by = c("Dates", "Accounts"))
方法2:用base R(无需额外安装包)
如果不想装新包,用base R自带的函数就能搞定:
# 生成所有日期和分类的组合 full_combinations <- expand.grid( Dates = unique(Origination$Dates), Accounts = unique(Origination$Accounts), stringsAsFactors = FALSE # 避免自动转成因子类型 ) # 合并数据,保留所有组合,缺失的Balances自动设为NA Origination_full <- merge( full_combinations, Origination, by = c("Dates", "Accounts"), all.x = TRUE )
方法3:用data.table(大数据量首选)
如果你的数据量很大,data.table的运行效率会比前两种高很多:
- 安装加载data.table包
install.packages("data.table") library(data.table)
- 转成data.table格式并补全缺失行
setDT(Origination) # 把普通数据框转成data.table格式 # 用CJ生成笛卡尔积,通过on参数关联原始数据 Origination_full <- Origination[ CJ(Dates = unique(Dates), Accounts = unique(Accounts)), on = .(Dates, Accounts) ]
不管用哪种方法,最终得到的Origination_full都会包含每个日期下所有分类的行,原本没有的行Balances会自动填充为NA,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Aksel Etingu
相关产品推荐
相关产品推荐

