Angenommen ich diesen Datenrahmen haben:Werte in einem Datenrahmen in R ausfüllen?
times vals
1 1 2
2 3 4
3 7 6
mit
foo <- data.frame(times=c(1,3,7), vals=c(2,4,6))
einrichten und ich möchte diese:
times vals
1 1 2
2 2 2
3 3 4
4 4 4
5 5 4
6 6 4
7 7 6
Das heißt, ich in allen Zeiten füllen wollen von 1 bis 7, und füllen Sie die Werte von der letzten Zeit, die nicht größer als die angegebene Zeit ist.
Ich habe einen Code, um es mit dplyr zu tun, aber es ist hässlich. Vorschläge für bessere?
library(dplyr)
foo <- merge(foo, data.frame(times=1:max(foo$times)), all.y=TRUE)
foo2 <- merge(foo, foo, by=c(), suffixes=c('', '.1'))
foo2 <- foo2 %>% filter(is.na(vals) & !is.na(vals.1) & times.1 <= times) %>%
group_by(times) %>% arrange(-times.1) %>% mutate(rn = row_number()) %>%
filter(rn == 1) %>%
mutate(vals = vals.1,
rn = NULL,
vals.1 = NULL,
times.1 = NULL)
foo <- merge(foo, foo2, by=c('times'), all.x=TRUE, suffixes=c('', '.2'))
foo <- mutate(foo,
vals = ifelse(is.na(vals), vals.2, vals),
vals.2 = NULL)
'data.frame (zeit = 1: 7, vals = foo $ vals [findInterval (1: 7, foo $ mal)])' wird für NAs funktionieren, da @eddi es für ein so wichtiges Thema gehalten hat – rawr