Это хорошее задание для gather
и spread
с tidyr
вместе с group_by
, mutate
с dplyr
и parse_number
с readr
:
library(tidyverse)
mydata %>%
gather(source, value, starts_with("Source")) %>%
mutate(source_year = parse_number(source)) %>%
group_by(ID, Year) %>%
mutate(any_na = anyNA(value[Year <= source_year])) %>%
select(-source_year) %>%
spread(source, value)
# A tibble: 4 x 7
# Groups: ID, Year [4]
# ID Year any_na Source_1999 Source_2000 Source_2001 Source_2002
# <int> <int> <lgl> <chr> <chr> <chr> <chr>
# 1 1 1999 FALSE ABC ABC ABC ABC
# 2 2 2001 TRUE ABC BBB XYZ NA
# 3 3 2000 FALSE NA ABC BBB BBB
# 4 4 2001 TRUE NA NA NA NA
Шаг за шагом
Сначала превратите ваши данные из широкоформатного формата в длинный и извлеките год столбца источника.
mydata <- mydata %>%
gather(source, value, starts_with("Source")) %>%
mutate(source_year = parse_number(source))
mydata
# A tibble: 16 x 5
# ID Year source value source_year
# <int> <int> <chr> <chr> <dbl>
# 1 1 1999 Source_1999 ABC 1999
# 2 2 2001 Source_1999 ABC 1999
# 3 3 2000 Source_1999 NA 1999
# 4 4 2001 Source_1999 NA 1999
# 5 1 1999 Source_2000 ABC 2000
# ...
Затем сгруппируйте по идентификатору и году, чтобы в этих группах применялись следующие вычисления. отфильтруйте значение по source_Years, которое больше или равно году группы, и проверьте, есть ли какие-либо NA
'
mydata <- mydata %>%
group_by(ID, Year) %>%
mutate(any_na = anyNA(value[Year <= source_year]))
mydata
# A tibble: 16 x 6
# Groups: ID, Year [4]
# ID Year source value source_year any_na
# <int> <int> <chr> <chr> <dbl> <lgl>
# 1 1 1999 Source_1999 ABC 1999 FALSE
# 2 2 2001 Source_1999 ABC 1999 TRUE
# 3 3 2000 Source_1999 NA 1999 FALSE
# 4 4 2001 Source_1999 NA 1999 TRUE
# 5 1 1999 Source_2000 ABC 2000 FALSE
# ...
Наконец, удалите столбец yource_year, поскольку он больше не нужен, и преобразуйте данные из длинного в широкий формат:
mydata <- mydata %>%
select(-source_year) %>%
spread(source, value)
Данные
mydata <- tibble(ID = 1:4,
Year = c(1999L, 2001L, 2000L, 2001L),
Source_1999 = c("ABC", "ABC", NA, NA),
Source_2000 = c("ABC", "BBB", "ABC", NA),
Source_2001 = c("ABC", "XYZ", "BBB", NA),
Source_2002 = c("ABC", NA, "BBB", NA))