我有这个数据框,它具有3列规范,即publish_date和price。复制代码已添加:
-ltsan
假设日期“ 2017-08-01”和规格“ 3 / 4inches | 20x22 | 7.11”的价格为16.14,那么对于下一个日期,相同规格的价格应为16.14。
x=as.data.frame(c("3/4inches|20x20|4.56",
"3/4inches|20x21|5.56","3/4inches|20x22|7.11"))
x1=do.call("rbind",replicate(3,x,simplify = F))
colnames(x1)="specification"
sd=as.data.frame(seq(as.Date("2017-08-01"),as.Date("2017-08-03"),by = "day"))
sd=sd[rep(seq_len(nrow(sd)), each=3),]
sd=data.frame(sd)
colnames(sd)="publish_date"
price=data.frame(c(12.34,12.54,""))
price=do.call("rbind",replicate(3,price,simplify = F))
colnames(price)="price"
df.sample=cbind(sd,x1,price)
df.sample
publish_date specification price
1 2017-08-01 3/4inches|20x20|4.56 12.34
2 2017-08-01 3/4inches|20x21|5.56 12.54
3 2017-08-01 3/4inches|20x22|7.11
4 2017-08-02 3/4inches|20x20|4.56 12.34
5 2017-08-02 3/4inches|20x21|5.56 12.54
6 2017-08-02 3/4inches|20x22|7.11
7 2017-08-03 3/4inches|20x20|4.56 12.34
8 2017-08-03 3/4inches|20x21|5.56 12.54
9 2017-08-03 3/4inches|20x22|7.11
因此,总结一下查询:对于缺少价格的日期,我需要检查前几天的日期,然后匹配规格,然后将价格从前一个日期拉到当前日期。
提前谢谢!实际数据具有位置检查以及35678天的67规格。因此输入将很有帮助。
答案 0 :(得分:1)
因此,如果我理解正确,那么您只希望使用相同规格的先前值? 首先将data.frame拆分为单独的案例是最容易的,然后我们只需要向上看即可。
na.locf
包中有一个函数zoo
,几乎可以满足您的需求:它将最后一个非NA
值替换为任何NA
。在这里,我仅假设您的data.frame按日期排序。
最后,我注意到您使用空字符串表示缺少的值,通常您想为此使用NA
。并且na.locf
仅在NA
上有效,因此第一步我替换了空字符串
install.packages('zoo') # If you don't have it yet
df.sample$price[df.sample$price==""] <- NA
spl <- split(df.sample, df.sample$specification)
spl <- lapply(spl, zoo::na.locf, na.rm=FALSE)
df.sample <- unsplit(spl, df.sample$specification)
仅当您有没有之前价格的产品时,这些产品仍为NA