【发布时间】:2016-09-07 05:25:46
【问题描述】:
假设我有这个数据框:
times vals
1 1 2
2 3 4
3 7 6
设置
foo <- data.frame(times=c(1,3,7), vals=c(2,4,6))
我想要这个:
times vals
1 1 2
2 2 2
3 3 4
4 4 4
5 5 4
6 6 4
7 7 6
也就是说,我要填写1到7的所有时间,并且从不大于给定时间的最晚时间开始填写vals。
我有一些代码可以使用 dplyr 来完成,但它很难看。有更好的建议吗?
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(time = 1:7, vals = foo$vals[findInterval(1:7, foo$times)])将适用于 NA,因为 @eddi 认为这是一个如此重要的问题