Как заполнить столбец указанным значением, если оно находится в диапазоне значений двух других столбцов? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть один фрейм данных A со значениями для начального года и года окончания, где ccode идентифицирует единицу

ccode StartYear1 EndYear1
 2       1950     1953
 2       1965     1973

и другой фрейм данных B, который имеет одно наблюдение для каждого ccode и за год

ccode  year
  2    1950
  2    1951
  2    1952
  2    1953
  2    1954
  2    1955

Я хотел бы добавить новую переменную во второй фрейм данных, равную единице для каждого года в диапазоне от StartYear1 до EndYear1, которая соответствует переменной "ccode". Таким образом, на выходе должен быть фрейм данных B

ccode  year  flag
  2    1950    1
  2    1951    1
  2    1952    1
  2    1953    1
  2    1954    0
  2    1955    0

Я пробовал следующий код

dfB <-
  dfB %>%
  group_by(ccode,year) %>%
  mutate(flag= year %in% list(seq(dfA$StartYear1,dfA$EndYear1)))

, но я не могу понять, как присвоить значение "1" годам в этот диапазон. Как я могу назначить значение c, если строка находится в списке (seq (StartYear1, EndYear1))? Спасибо!

ОБНОВЛЕНИЕ ***

Акрун, я запустил твой код и получил следующие результаты

 ccode  year  flag
      2    1950    1
      2    1951    1
      2    1952    1
      2    1953    1
      2    1954    1
      2    1955    1

, которые должны быть

 ccode  year  flag
      2    1950    1
      2    1951    1
      2    1952    1
      2    1953    1
      2    1954    0
      2    1955    0

Должна ли группа_by указывать код или годы?

1 Ответ

0 голосов
/ 17 апреля 2020

Мы можем использовать map2 из purrr для создания последовательности, а затем проверить, являются ли значения этой последовательности %in% вторым набором данных 'year'

library(dplyr)
library(purrr)
df1 <- dfA %>%
        mutate(yearfull = map2(StartYear1, EndYear1, `:`)) %>%
        unnest(c(yearfull))

dfB %>% 
     mutate(flag = +(year %in% df1$yearfull))
#  ccode year flag
#1     2 1950    1
#2     2 1951    1
#3     2 1952    1
#4     2 1953    1
#5     2 1954    0
#6     2 1955    0

data

dfA <- structure(list(ccode = c(2L, 2L), StartYear1 = c(1950L, 1965L
), EndYear1 = c(1953L, 1973L)), class = "data.frame", row.names = c(NA, 
-2L))

dfB <- structure(list(ccode = c(2L, 2L, 2L, 2L, 2L, 2L), year = 1950:1955), 
  class = "data.frame", row.names = c(NA, 
-6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...