我有一组日期(参考日期)和一个数据框,用于支持某些公司在特定时间段内的收盘价。我想检查所有公司的数据是否与参考日期清单中的每个日期相对应。所以,我基本上想要确定缺少的日期并将它们插入到公司数据中。
我的数据看起来像这样 -
Company Code Date Closing Price
ABB.NS 2010-08-09 288.12
ABB.NS 2010-08-10 289.2
ABB.NS 2010-08-12 302
.
.
.
ABB.NS 2010-08-30 278
ABAN.NS 2010-08-09 97.8
ABAN.NS 2010-08-10 98.6
.
.
.
ABAN.NS 2010-08-30 102.6
我的日期列表包括08/2010个月的所有日期。因此,我的代码应该与给定数据集的日期匹配,确定所有公司中缺少的日期。 (此处,例如ABB缺少“2010-08-11”)并为缺失的数据插入一行,其中收盘价格低于上一个和下一个收盘价的平均值。所以,这里它将是(289.2 + 302)/ 2。
我尝试使用匹配功能。但我无法将其整合到这个确切的目的。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
尝试
res <- merge(df,df1, by=c('Date', 'Company.Code'),all=TRUE)
library(zoo)
res$Closing.Price <- na.locf(na.approx(res$Closing.Price,
na.rm=FALSE), na.rm=FALSE)
res1 <- res[with(res, order(Company.Code, Date)),]
row.names(res1) <- NULL
res1[41:43,]
# Date Company.Code Closing.Price
#41 2010-08-10 ABB.NS 289.2
#42 2010-08-11 ABB.NS 295.6
#43 2010-08-12 ABB.NS 302.0
df <- structure(list(Company.Code = c("ABB.NS", "ABB.NS", "ABB.NS",
"ABB.NS", "ABAN.NS", "ABAN.NS", "ABAN.NS"), Date = structure(c(14830,
14831, 14833, 14851, 14830, 14831, 14851), class = "Date"), Closing.Price =
c(288.12, 289.2, 302, 278, 97.8, 98.6, 102.6)), .Names = c("Company.Code",
"Date", "Closing.Price"), row.names = c(NA, -7L), class = "data.frame")
UnComp <- unique(df$Company.Code)
df1 <- data.frame(Company.Code= rep(UnComp, each=31),
Date=rep(seq(as.Date('2010-08-01'), by='1 day',
length.out=31),length(UnComp))