Как сохранить последний, не пропущенный набор полных наблюдений в нескольких столбцах? - PullRequest
1 голос
/ 29 мая 2019

У меня есть набор продольных данных, и я хотел бы извлечь последний, не отсутствующий полный набор наблюдений для каждой переменной в наборе данных, где id - это уникальный идентификатор, yr - год, а x1 и x2 - переменные с отсутствующими ценности. Фактический набор данных имеет сотни переменных в течение 60 лет.

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 голосов
/ 29 мая 2019

Использование 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)))
0 голосов
/ 29 мая 2019

Вот решение 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 значения (т. Е. Сохраняю те, которые 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

Создано в 2019-05-29 с помощью пакета Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...