删除 "outer rows" 以允许插值(并防止外推)

Removing "outer rows" to allow for interpolation (and prevent extrapolation)

我已经(左)按国家年份加入了两个数据框。

df<- left_join(df, df2, by="country-year")

导致以下示例输出:

   country country-year    a     b
1  France  France2000        NA    NA 
2  France  France2001      1000  1000  
3  France  France2002        NA    NA
4  France  France2003      1600  2200
5  France  France2004        NA    NA
6  UK          UK2000      1000  1000  
7  UK          UK2001        NA    NA
8  UK          UK2002      1000  1000  
9  UK          UK2003        NA    NA
10 UK          UK2004        NA    NA

我最初想删除所有添加的列 (a,b) 都是 NA 的值。

df<-df[!is.na( df$a | df$b ),]

但是,在第二种情况下,我决定对我拥有的数据进行插值(但不是外推)。因此,我想删除所有无法插入的列;在示例中:

1  France  France2000        NA    NA
5  France  France2004        NA    NA
9  UK          UK2003        NA    NA
10 UK          UK2004        NA    NA

我相信有两种选择。首先我以某种方式调整这个函数:

library(tidyerse)
TRcomplete<-TRcomplete%>%
  group_by(country) %>%
  mutate_at(a:b,~na.fill(.x,"extend"))

仅插值,然后移除然后应用 df<-df[!is.na( df$a | df$b ),]

或者我写一个代码先删除 "outer" 列,然后像平常一样使用 extend。期望的输出:

   country country-year    a     b 
2  France  France2001      1000  1000  
3  France  France2002      1300  1600
4  France  France2003      1600  2200
6  UK          UK2000      1000  1000  
7  UK          UK2001         0     0
8  UK          UK2002      1000  1000  

有什么建议吗?

na.fill 中有选项可以指定完成的操作。如果你看?na.fill,你看到fill可以指定left,interior和right,所以如果你指定left和right是NA,interior是"extend",那么它会只填写内部数据。然后,您可以 filter 具有 NA 的行。

library(tidyverse)
library(zoo)
df %>%
  group_by(country) %>%
  mutate_at(vars(a:b),~na.fill(.x,c(NA, "extend", NA))) %>% 
  filter(!is.na(a) | !is.na(b))

顺便说一下,你的 library(tidyverse) 语句中有错字;你错过了 v.