Заполнение столбца в кадре данных на основе нескольких условий в R - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть этот фрейм данных, который имеет 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 спецификациями. Поэтому вводные данные будут полезны.

1 Ответ

0 голосов
/ 21 декабря 2018

Так что, если я правильно понимаю, вы смотрите на предыдущие значения для той же спецификации?Проще всего сначала разбить ваш 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

...