如何在多列中保留最后一组完整的观测值?

时间:2019-05-29 17:31:42

标签: r

我有一个纵向数据集,并希望为数据集中的每个变量提取最新的,完整的观测值集合,其中id是唯一标识符,yr是年份,x1和x2是缺失的变量价值观。实际数据集在60年的过程中有100多个变量。

data <- data.frame(id=rep(1:3,3)
yr=rep(1:3,times=1, each=3)
x1=c(1,3,7,NA,NA,NA,9,4,10)
x2=c(NA,NA,NA,3,9,6,NA,NA,NA))

以下是我的预期结果。对于x1,最新的完整观测值是3年。对于x2,最新的完整观测值是2年。

2 个答案:

答案 0 :(得分:0)

这是一个tidyverse解决方案。首先,我创建数据框。

# Create data frame
df <- data.frame(id=rep(1:3,3),
                   yr=rep(1:3,times=1, each=3),
                   x1=c(1,3,7,NA,NA,NA,9,4,10),
                   x2=c(NA,NA,NA,3,9,6,NA,NA,NA))

接下来,我加载所需的库。

# Load library
library(dplyr)
library(tidyr)

然后,我从宽格式转到长格式,按yrkey(即变量名)分组,删除具有NA值的变量(即,保留那些< strong> all not NA),按key分组,保留最大年份中的那些数据,切换回宽格式,并安排制作打印的结果看起来很漂亮。

df %>% 
  gather("key", "val", x1, x2) %>% 
  group_by(yr, key) %>% 
  filter(all(!is.na(val))) %>% 
  group_by(key) %>% 
  filter(yr == max(yr)) %>% 
  spread(key, val) %>% 
  arrange(yr)
#> # A tibble: 6 x 4
#>      id    yr    x1    x2
#>   <int> <int> <dbl> <dbl>
#> 1     1     2    NA     3
#> 2     2     2    NA     9
#> 3     3     2    NA     6
#> 4     1     3     9    NA
#> 5     2     3     4    NA
#> 6     3     3    10    NA

reprex package(v0.3.0)于2019-05-29创建

答案 1 :(得分:0)

使用base R

subset(data, yr %in% names(tail(which(sapply(split(data[c('x1', 'x2')], 
        data$yr), function(x) any(colSums(!is.na(x)) == nrow(x)))), 2)))