根据 R 中的多个条件填充数据框中的列

Populating a column in a data-frame based on multiple conditions in R

我有这个数据框,它有 3 列规格、publish_date 和价格。添加复制代码:

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      

假设日期“2017-08-01”和规格“3/4inches|20x22|7.11”的价格是 16.14,那么对于下一个日期,相同规格的价格应该显示为 16.14。

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** **16.14**     
    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 **16.14**    
    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 **16.14**

因此,总结查询:对于价格缺失的日期,我需要检查前几天的日期,然后匹配规范,然后将价格从前一天拉到当前日期。

提前致谢!实际数据有位置检查以及 35678 天,67 specifications.Hence 输入会有所帮助。

因此,如果我理解正确的话,您只查看相同规格的先前值? 最简单的方法是先将 data.frame 拆分成单独的案例,然后我们只需要向上看即可。

zoo 包中的函数 na.locf 几乎完全满足您的需求:它将所有 NA 替换为最后一个非 NA ] 价值。在这里,我仅假设您的 data.frame 是按日期排序的。 最后我注意到您使用空字符串来表示缺失值,通常您希望为此使用 NAna.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