Как создать фиктивные переменные с некоторыми условиями, используя цикл в R? - PullRequest
1 голос
/ 07 июля 2019

Я пытаюсь создать группу фиктивных переменных с 2 условиями, каждое из которых основано на имени переменной, но я не уверен, как действовать

   I have the following dataset "dat"

  ID Entry   Exit   y2000 y2001 y2002 y2003 ....
  1   1999  2010     0      0     0     0
  2   2000  2001     0   ......
  3   2002  2003     0  ........
  4   1999  2002
  5   .....

на данный момент все y "i"переменные в основном равны 0, я хочу присвоить значение 1 переменной y2000, если запись меньше или равна 2000, а выход аналогично больше или равен 2000, для переменной y2001 я хочу присвоить значение 1, если запись меньше илиравен 2001, а выход больше или равен 2001 и т. д.

Я могу сделать это для переменной signle следующим образом:

      dat$y2000[dat$exit >= 2000 & dat$enter <= 2000] <- 1

, но я бы хотел сделать это вцикл для каждой переменной типа у "я", как я могу сделать?

заранее благодарю за помощь

1 Ответ

1 голос
/ 07 июля 2019

Мы можем сделать это с 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...