2016-03-15 3 views
0
WEEK PRICE QUANTITY SALE_PRICE TYPE 
1 4992 5.99 2847.50  0.00 3 
2 4995 3.33 36759.00  3.33 3 
3 4996 5.99 2517.00  0.00 3 
4 4997 5.49 2858.50  0.00 3 
5 5001 3.33 32425.00  3.33 3 
6 5002 5.49 4205.50  0.00 3 
7 5004 5.99 4329.50  0.00 3 
8 5006 2.74 55811.00  2.74 3 
9 5007 5.49 4133.00  0.00 3 
10 5008 5.99 4074.00  0.00 3 
11 5009 3.99 12125.25  3.99 3 
12 5017 2.74 77645.00  2.74 3 
13 5018 5.49 5315.50  0.00 3 
14 5020 2.74 78699.00  2.74 3 
15 5021 5.49 5158.50  0.00 3 
16 5023 5.99 5315.00  0.00 3 
17 5024 5.49 6545.00  0.00 3 
18 5025 3.33 63418.00  3.33 3 

Если есть последовательные 0 записей о цене продажи, я хочу сохранить последнюю запись с ценой продажи 0. Как я хочу удалить неделю 4996 и хочу сохранить неделю 4997, я хочу неделю 5004, и я хочу удалить 5002. Аналогичным образом я хочу удалить 5021 & 5023 и хочу сохранить неделю 5024.Ошибка: отсутствует значение, где требуется TRUE/FALSE

+0

Как вы получили сообщение об ошибке? – akrun

+0

для (i в 1: (nrow (price.hierarchy) -1)) { if (price.hierarchy $ SALE_PRICE [i] == 0 & price.hierarchy $ SALE_PRICE [i + 1] == 0) { Цена.иерархия <- цена.иерархия [-i,] } else price.hierarchy } – sayali

ответ

1

Мы можем использовать data.table. Преобразуйте 'data.frame' в 'data.table' (setDT(df1)). создайте переменную группировки с rleid на основе логического вектора наличия 0 в 'SALE_PRICE' (!SALE_PRICE). Используя «grp» как переменную группировки, мы получаем последнюю строку «Подмножество данных.table (.SD[.N]) if« SALE_PRICE elements are all 0 or else get the .SD` i.все полные строки для определенной группы.

library(data.table) 
setDT(df1)[, grp:= rleid(!SALE_PRICE) 
      ][,if(all(!SALE_PRICE)) .SD[.N] else .SD , grp 
      ][, grp := NULL][] 
#  WEEK PRICE QUANTITY SALE_PRICE TYPE 
# 1: 4992 5.99 2847.50  0.00 3 
# 2: 4995 3.33 36759.00  3.33 3 
# 3: 4997 5.49 2858.50  0.00 3 
# 4: 5001 3.33 32425.00  3.33 3 
# 5: 5004 5.99 4329.50  0.00 3 
# 6: 5006 2.74 55811.00  2.74 3 
# 7: 5008 5.99 4074.00  0.00 3 
# 8: 5009 3.99 12125.25  3.99 3 
# 9: 5017 2.74 77645.00  2.74 3 
#10: 5018 5.49 5315.50  0.00 3 
#11: 5020 2.74 78699.00  2.74 3 
#12: 5024 5.49 6545.00  0.00 3 
#13: 5025 3.33 63418.00  3.33 3 

Или вариант с использованием dplyr путем создания группировки переменной с diff и cumsum, затем filter строки, чтобы сохранить только последнюю строку «SALE_PRICE», которые равны 0 или (|) выбора строки, в которых 'SALE_PRICE' не 0.

library(dplyr) 
df1 %>% 
    group_by(grp = cumsum(c(TRUE,diff(!SALE_PRICE)!=0))) %>% 
    filter(!duplicated(!SALE_PRICE, fromLast=TRUE)|SALE_PRICE!=0) %>% 
    select(-grp) 
#  grp WEEK PRICE QUANTITY SALE_PRICE TYPE 
# (int) (int) (dbl) (dbl)  (dbl) (int) 
#1  1 4992 5.99 2847.50  0.00  3 
#2  2 4995 3.33 36759.00  3.33  3 
#3  3 4997 5.49 2858.50  0.00  3 
#4  4 5001 3.33 32425.00  3.33  3 
#5  5 5004 5.99 4329.50  0.00  3 
#6  6 5006 2.74 55811.00  2.74  3 
#7  7 5008 5.99 4074.00  0.00  3 
#8  8 5009 3.99 12125.25  3.99  3 
#9  8 5017 2.74 77645.00  2.74  3 
#10  9 5018 5.49 5315.50  0.00  3 
#11 10 5020 2.74 78699.00  2.74  3 
#12 11 5024 5.49 6545.00  0.00  3 
#13 12 5025 3.33 63418.00  3.33  3 
Смежные вопросы