我有一个纵向数据集,并希望为数据集中的每个变量提取最新的,完整的观测值集合,其中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年。
答案 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)
然后,我从宽格式转到长格式,按yr
和key
(即变量名)分组,删除具有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)))