2016-06-22 4 views
1
Füllen

ich einen Datenrahmen haben, und ich bin mit:Füllen Sie eine begrenzte Anzahl von Werten - tidyr

df <- data.frame(dates = seq(as.Date("2016-01-01"),as.Date("2016-01-10"), by=1) 
     , category = c(rep("a",5), rep("b",5)) 
     , values= c(1, rep(NA,4), 5,6, rep(NA,3))) 

df %>% group_by(category) %>% fill(values) 

aber ich würde eine bestimmte Anzahl von Stellen nur gerne füllen vortragen (dh nach vorne tragen stoppen, wenn es zu weit vom Ausgangspunkt entfernt). Gibt es eine einfache Möglichkeit, dies ohne eine for-Schleife zu tun?

In diesem Beispiel würde ich gerne aufhören zu füllen, wenn das Datum> 2 Tage vom letzten Nicht-NA-Punkt entfernt ist. Also die Werte Spalte wäre

values = c(1,1,1,NA,NA, 5,6,6,6,NA) 

Danke

+0

Pls für ein Beispiel geben Sie Ihren Code –

Antwort

1

Eine Möglichkeit, es zu tun ist, um erste fill(values) und wandeln dann alle Werte NA, die nach mehr als zwei Tage von den letzten Punkt beobachtet wurden, nicht-NA (dh max(dates[!is.na(values)])).

library(dplyr) 
library(tidyr) 

df %>% 
    group_by(category) %>% 
    mutate(new_date = max(dates[!is.na(values)]), diff1 = as.numeric(difftime(dates, new_date)/(24*3600))) %>% 
    fill(values) %>% 
    mutate(values = replace(values, which(diff1 > 2), NA)) %>% 
    select(dates:values) 

#Source: local data frame [10 x 3] 
#Groups: category [2] 

#  dates category values 
#  (date) (fctr) (dbl) 
#1 2016-01-01  a  1 
#2 2016-01-02  a  1 
#3 2016-01-03  a  1 
#4 2016-01-04  a  NA 
#5 2016-01-05  a  NA 
#6 2016-01-06  b  5 
#7 2016-01-07  b  6 
#8 2016-01-08  b  6 
#9 2016-01-09  b  6 
#10 2016-01-10  b  NA 

Notiere die difftime mir gab Sekunden so manuell ich Tage umgewandelt

+1

reproduzieren, das perfekt funktioniert, danke! –

Verwandte Themen