2016-06-30 2 views
1

У меня есть этот dataframe df1.Обновление столбца на основе предыдущих значений строки

User|Date|Index| 
    a |1 |1 | 
    a |1 |2 | 
    a |1 |3 | 
    a |1 |0 | 
    a |1 |5 | 
    a |1 |6 | 
    a |2 |0 | 
    b |4 |1 | 
    b |4 |2 | 
    b |4 |3 | 

Я хочу, чтобы обновить столбец индекса, следующим образом:

  1. Group данных по пользователю, дата;
  2. Предположим, что строки правильно упорядочены;
  3. Пройдите по столбцу Индекс, когда найдете значение 0, обновите его до 1 и исправьте следующие строки, увеличивая на 1 на основе предыдущей строки, до тех пор, пока не будет найдено другое значение 0.

Я сузил его до этого, но я не уверен, насколько полная часть замены выполняет то, что я хочу.

df1 %>% 
    group_by(User, Date) %>% 
    mutate(Index = replace(Index,) 

Может кто-нибудь мне помочь?


РЕДАКТИРОВАТЬ: dataframe выше, является упрощение. Это код.

df1 <-structure(list(User = c(2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,3), 
    Date = c(16864, 16864, 16864, 16864, 16864, 16879, 16879,16879, 16879, 16879, 16879, 16879, 16879, 16879), 
    Index = c(16,17, 0, 19, 20, 1, 2, 3, 0, 5, 0, 0, 8, 9)), 
    class = "data.frame", .Names = c("User","Date", "Index"), row.names = c(NA, -14L)) 

Это текущий вид:

User|Date |Index| 
    2 |16864 |16 | 
    2 |16864 |17 | 
    2 |16864 |0 | 
    2 |16864 |19 | 
    2 |16864 |20 | 
    3 |16879 |1 | 
    3 |16879 |2 | 
    3 |16879 |3 | 
    3 |16879 |0 | 
    3 |16879 |5 | 
    3 |16879 |0 | 
    3 |16879 |0 | 
    3 |16879 |8 | 
    3 |16879 |9 | 

Нужный выход:

User|Date |Index| 
    2 |16864 |16 | 
    2 |16864 |17 | 
    2 |16864 |1 | 
    2 |16864 |2 | 
    2 |16864 |3 | 
    3 |16879 |1 | 
    3 |16879 |2 | 
    3 |16879 |3 | 
    3 |16879 |1 | 
    3 |16879 |2 | 
    3 |16879 |1 | 
    3 |16879 |1 | 
    3 |16879 |2 | 
    3 |16879 |3 | 
+0

Можете ли вы показать ожидаемый положил? Также, пожалуйста, [посмотреть эту ссылку] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) и пересмотреть – Sotos

+0

Есть ли причина не просто заменить нули с 1s в качестве первого шага? Если вы заменяете все из них, я не понимаю, почему это нужно делать итеративно. – mkt

+0

Нет особых причин для 0. Думаю, он мог начаться уже как 1. – JessicaJones

ответ

3

Существует, вероятно, более разумный способ для достижения этой цели, но вот моя попытка с пользовательской функцией

myfun <- function(x) { 
    indx <- which(x == 0L) 
    c(x[1L:(indx[1L] - 1L)], sequence(c(diff(indx), length(x) - last(indx) + 1L))) 
} 

df1 %>% 
    group_by(User, Date) %>% 
    mutate(Index = myfun(Index)) 

# Source: local data frame [14 x 3] 
# Groups: User, Date [2] 
#  User Date Index 
# (dbl) (dbl) (dbl) 
# 1  2 16864 16 
# 2  2 16864 17 
# 3  2 16864  1 
# 4  2 16864  2 
# 5  2 16864  3 
# 6  3 16879  1 
# 7  3 16879  2 
# 8  3 16879  3 
# 9  3 16879  1 
# 10  3 16879  2 
# 11  3 16879  1 
# 12  3 16879  1 
# 13  3 16879  2 
# 14  3 16879  3 
+0

Когда я применяю эту функцию к аналогичному фрейму данных, он возвращает ошибку несовместимого размера. Любая идея, почему это может быть? Я пытался использовать отладку, но я не смог понять, почему. Есть ли у вас предложения? – JessicaJones

Смежные вопросы