我的dataframe有一个日期列和两个数值列,包括一些NA
s,类似于这样:
df
# Date a b
# 1 1990-02-01 NA NA
# 2 1990-03-01 NA NA
# 3 1990-04-01 NA 3
# 4 1990-05-01 1 4
# 5 1990-06-01 2 5
# 6 1990-07-01 3 NA
# 7 1990-08-01 4 7
# 8 1990-09-01 5 NA
# 9 1990-10-01 6 9
# 10 1990-11-01 7 NA
# 11 1990-12-01 8 NA
# 12 1991-01-01 9 NA
# 13 1991-02-01 10 13
# 14 1991-03-01 11 14
# 15 1991-04-01 12 15
# 16 1991-05-01 13 NA
我想保留时间序列开始之前的NA,然后用零替换它们,最终结果应该如下所示:
finaldf
# Date a b
# 1 1990-02-01 NA NA
# 2 1990-03-01 NA NA
# 3 1990-04-01 NA 3
# 4 1990-05-01 1 4
# 5 1990-06-01 2 5
# 6 1990-07-01 3 0
# 7 1990-08-01 4 7
# 8 1990-09-01 5 0
# 9 1990-10-01 6 9
# 10 1990-11-01 7 0
# 11 1990-12-01 8 0
# 12 1991-01-01 9 0
# 13 1991-02-01 10 13
# 14 1991-03-01 11 14
# 15 1991-04-01 12 15
# 16 1991-05-01 13 0
有没有一些很酷的软件包中的替换/填充功能可以做到这一点?或者你自己会如何解决这个问题?
数据
df <- data.frame(Date=seq(lubridate::ymd('1990-02-01'), lubridate::ymd('1991-05-01'), by='1 month'),
a=c(rep(NA, 3), 1:13),
b=c(NA, NA, 3, 4, 5, NA, 7, NA, 9, NA, NA, NA, 13, 14, 15, NA))
finaldf <- data.frame(Date=seq(lubridate::ymd('1990-02-01'), lubridate::ymd('1991-05-01'), by='1 month'),
a=c(rep(NA, 3), 1:13),
b=c(NA, NA, 3, 4, 5, 0, 7, 0, 9, 0, 0, 0, 13, 14, 15, 0))
5条答案
按热度按时间az31mfrm1#
你可以考虑这样的事情:
wfveoks02#
我们可以使用
across
检查列a
和b
,并结合ifelse
语句来完成此操作:nfeuvbwi3#
这和TarJae的回答很像,但更有活力:
这个返回
insrf1ej4#
我们可以在
which.min
和which.max
之间replace
,不需要封装。knpiaxh15#
zoo::na.fill
接受第二个参数,其中包含3个元素,用于填充前导、内部和尾随NA,因此:或