基于R中的多个条件在数据框中填充列

时间:2018-12-21 10:10:26

标签: r dataframe missing-data

我有这个数据框,它具有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规格。因此输入将很有帮助。

1 个答案:

答案 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