R 如何用组内以前的非NaN值替换NaN值

R 如何用组内以前的非NaN值替换NaN值,r,dplyr,R,Dplyr,我需要用组中以前的非NaN值替换NaN值 这是一个例子: +-------+------------+-------+ | ts_id | date | value | +-------+------------+-------+ | 2 | 01/10/2014 | 18 | | 2 | 01/11/2014 | 15 | | 2 | 01/12/2014 | NaN | | 2 | 01/01/2015 | NaN | |

我需要用组中以前的非NaN值替换NaN值

这是一个例子:

+-------+------------+-------+
| ts_id |    date    | value |
+-------+------------+-------+
|     2 | 01/10/2014 | 18    |
|     2 | 01/11/2014 | 15    |
|     2 | 01/12/2014 | NaN   |
|     2 | 01/01/2015 | NaN   |
|     2 | 01/02/2015 | NaN   |
|     3 | 01/03/2015 | 19    |
|     3 | 01/04/2015 | 20    |
|     3 | 01/10/2015 | 12    |
|     3 | 01/11/2015 | 17    |
|     3 | 01/12/2015 | NaN   |
|     3 | 01/01/2016 | NaN   |
|     3 | 01/08/2016 | 7     |
|     3 | 01/09/2016 | NaN   |
|     3 | 01/10/2016 | NaN   |
|     3 | 01/11/2016 | NaN   |
|     3 | 01/12/2016 | NaN   |
|     3 | 01/01/2017 | NaN   |
+-------+------------+-------+
数据:

提前感谢。

您可以使用以下功能:

library(dplyr)
library(zoo) # for the na.locf function
data %>% 
  group_by(ts_id) %>% # group by id
  mutate(value = na.locf(value,na.rm=F)) # na.locf fills with the last non-empty value

#head()
# # A tibble: 6 x 3
# # Groups:   ts_id [2]
# ts_id date       value
# <dbl> <date>     <dbl>
# 1     2 2014-10-01    18
# 2     2 2014-11-01    15
# 3     2 2014-12-01    15
# 4     2 2015-01-01    15
# 5     2 2015-02-01    15
# 6     3 2015-03-01    19
库(dplyr)
图书馆(动物园)#用于na.locf功能
数据%>%
分组依据(ts_id)%>%#分组依据id
mutate(value=na.locf(value,na.rm=F))35; na.locf用最后一个非空值填充
#总目()
##tibble:6 x 3
##组:ts#u id[2]
#ts_id日期值
#       
# 1     2 2014-10-01    18
# 2     2 2014-11-01    15
# 3     2 2014-12-01    15
# 4     2 2015-01-01    15
# 5     2 2015-02-01    15
# 6     3 2015-03-01    19

遵循与
na.locf
相同的逻辑,但将其保留在“韵文”中,我们可以这样做

library(tidyverse)

data %>% 
  group_by(ts_id) %>% 
  mutate(value = replace(value, is.nan(value), NA)) %>% 
  fill(value) 

我不知道
na.locf
也适用于
NaN
。或者(将其全部保留在“韵文”中),然后
library(tidyverse);数据%>%group_by(ts_id)%%>%mutate(value=replace(value,is.nan(value),NA))%%>%fill(value)
我认为您也应该将其添加为答案。仅供参考,我认为它仍然有效,因为在
NA.locf
内部使用
is.NA()
,这仍然为
nan
提供了
TRUE
,这是有意义的
library(dplyr)
library(zoo) # for the na.locf function
data %>% 
  group_by(ts_id) %>% # group by id
  mutate(value = na.locf(value,na.rm=F)) # na.locf fills with the last non-empty value

#head()
# # A tibble: 6 x 3
# # Groups:   ts_id [2]
# ts_id date       value
# <dbl> <date>     <dbl>
# 1     2 2014-10-01    18
# 2     2 2014-11-01    15
# 3     2 2014-12-01    15
# 4     2 2015-01-01    15
# 5     2 2015-02-01    15
# 6     3 2015-03-01    19
library(tidyverse)

data %>% 
  group_by(ts_id) %>% 
  mutate(value = replace(value, is.nan(value), NA)) %>% 
  fill(value)