我正在尝试填充数据集中的某些值。我的数据的简化版本可以在下面找到:
> example_df
Date GROUP value
157 2018-01-31 10180 3.464
158 2018-02-28 10180 3.413
159 2018-03-31 10180 3.418
160 2018-04-30 10180 NA
161 2018-05-31 10180 NA
162 2018-06-30 10180 NA
163 2018-07-31 10180 NA
164 2018-08-31 10180 NA
165 2018-09-30 10180 NA
166 2018-10-31 10180 NA
167 2018-11-30 10180 NA
168 2018-12-31 10180 NA
169 2019-01-31 10180 NA
170 2019-02-28 10180 NA
171 2019-03-31 10180 NA
172 2019-04-30 10180 NA
173 2019-05-31 10180 NA
174 2019-06-30 10180 NA
175 2019-07-31 10180 NA
176 2019-08-31 10180 NA
177 2019-09-30 10180 NA
178 2019-10-31 10180 NA
179 2019-11-30 10180 NA
373 2018-01-31 10420 5.085
374 2018-02-28 10420 5.051
375 2018-03-31 10420 4.993
376 2018-04-30 10420 NA
377 2018-05-31 10420 NA
378 2018-06-30 10420 NA
379 2018-07-31 10420 NA
380 2018-08-31 10420 NA
381 2018-09-30 10420 NA
382 2018-10-31 10420 NA
383 2018-11-30 10420 NA
384 2018-12-31 10420 NA
385 2019-01-31 10420 NA
386 2019-02-28 10420 NA
387 2019-03-31 10420 NA
388 2019-04-30 10420 NA
389 2019-05-31 10420 NA
390 2019-06-30 10420 NA
391 2019-07-31 10420 NA
392 2019-08-31 10420 NA
393 2019-09-30 10420 NA
394 2019-10-31 10420 NA
395 2019-11-30 10420 NA
589 2018-01-31 10500 5.796
590 2018-02-28 10500 5.860
591 2018-03-31 10500 5.913
592 2018-04-30 10500 NA
593 2018-05-31 10500 NA
594 2018-06-30 10500 NA
595 2018-07-31 10500 NA
596 2018-08-31 10500 NA
597 2018-09-30 10500 NA
598 2018-10-31 10500 NA
599 2018-11-30 10500 NA
600 2018-12-31 10500 NA
601 2019-01-31 10500 NA
602 2019-02-28 10500 NA
603 2019-03-31 10500 NA
604 2019-04-30 10500 NA
605 2019-05-31 10500 NA
606 2019-06-30 10500 NA
607 2019-07-31 10500 NA
608 2019-08-31 10500 NA
609 2019-09-30 10500 NA
610 2019-10-31 10500 NA
611 2019-11-30 10500 NA
如你所见。对于每个组,我有到今天的月份的值,然后是一组NA,直到下一组的开始。我想做的是,对于每个组,使用源自最后一个非NULL值的序列填充这些NA,并增加一个固定值(我选择0.065)直到该组的最终日期。我更喜欢dplyr解决方案,但任何有关如何实现这一目标的信息都会非常有用。谢谢。
答案 0 :(得分:2)
你可以做这样的事情(受到Frank和eddi的评论/解决方案的启发):
df$value2 <- ave(df$value, df$GROUP, cumsum(!is.na(df$value)),
FUN = function(x) x[1] + 0.065 * (1:length(x) - 1))
或我原来的ave
:
df$value2 <- ave(df$value, df$GROUP,
FUN = function(x) {nas_to_replace <- is.na(x) & seq_along(x) > tail(which(!is.na(x)),1)
replace(x, nas_to_replace,
tail(x[!is.na(x)],1) + 0.065*(1:sum(nas_to_replace)))} )
此功能旨在仅替换最后一次非NA之后的NA。因此,如果你有一个像c(NA, 1, 2, NA, NA)
这样的向量,它只会替换最后两个元素。
head(df)
# Date GROUP value value2
#1 2018-01-31 10180 3.464 3.464
#2 2018-02-28 10180 3.413 3.413
#3 2018-03-31 10180 3.418 3.418
#4 2018-04-30 10180 NA 3.483
#5 2018-05-31 10180 NA 3.548
#6 2018-06-30 10180 NA 3.613
答案 1 :(得分:2)
TreeItem
答案 2 :(得分:0)
不如data.table
解决方案那么优雅,但使用dplyr
并在此answer上构建,您可以执行以下操作:
library(dplyr)
df %>%
group_by(GROUP, tmp=cumsum(!is.na(value))) %>%
mutate(value=value[1] + 0.065*(0:(length(value)-1))) %>%
ungroup() %>%
select(-tmp)