Мы можем сделать это с Map
. Получите вектор имен столбцов 'y' с помощью grep
('nm1'), извлеките числовую часть из имени, используйте Map
, чтобы `заменить значения в соответствующем столбце 'y' на основе логического условия, созданного с помощью столбцы 'enter / exit' и обновите столбцы 'y' в исходном наборе данных
nm1 <- grep("^y\\d{4}$", names(dat), value = TRUE)
nm2 <- as.integer(sub("y", "", nm1))
dat[nm1] <- Map(function(x, y) replace(dat[[x]],
dat$Exit >= y & dat$Entry <= y, 1), nm1, nm2)
Или используя tidyverse
library(tidyverse)
dat %>%
gather(key, val, matches("^y")) %>%
mutate(colNum = readr::parse_number(key), %>%
val = +(Exit >= colNum & Entry <= colNum)) %>%
select(-colNum) %>%
spread(key, val)
данные
dat <- structure(list(ID = c(1L, 2L, 3L, 5L), Entry = c(1999L, 2000L,
2002L, 1999L), Exit = c(2010L, 2001L, 2003L, 2002L), y2000 = c(0L,
0L, 0L, 0L), y2001 = c(0L, 0L, 0L, 0L), y2002 = c(0L, 0L, 0L,
0L), y2003 = c(0L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA,
-4L))