Цикл в R для чтения данных из фрейма данных - PullRequest
0 голосов
/ 28 февраля 2020

Из приведенного ниже кода df - это фрейм данных, который содержит переменные ID и Date. df1 - фиксированный фрейм данных. Я sh создаю новый вектор с такими условиями: Если Дата от df находится между Начальной датой и Конечной датой в df1 и ID из df равен ID1 в df1, то код вернет соответствующий Результат из df1. Однако я получил эти предупреждающие сообщения, как показано в кодах ниже. Пожалуйста, помогите.

> Date = as.Date(c("01/01/2012", "01/02/2015", "01/01/2018", "01/05/2019"), format = '%d/%m/%Y')
> ID = c(1,2,3,1)
> df = data.frame(ID, Date)
> 
> Start_Date = as.Date(c("01/01/2011", "01/01/2011", "01/01/2019"), format = '%d/%m/%Y')
> End_Date = as.Date(c("31/12/2018", "31/12/2019", "31/12/2019"), format = '%d/%m/%Y')
> ID1 = c(1,2,3)
> Result =c("A","B","C")
> df1 = data.frame(ID1,Start_Date,End_Date, Result)
> 
> for(i in 1:nrow(df1)) {
+ if(Date >= Start_Date[i] & Date <= End_Date[i] & ID == ID1[i]) {Result[i]}
+ }
Warning messages:
1: In if (Date >= Start_Date[i] & Date <= End_Date[i] & ID == ID1[i]) { :
  the condition has length > 1 and only the first element will be used
2: In if (Date >= Start_Date[i] & Date <= End_Date[i] & ID == ID1[i]) { :
  the condition has length > 1 and only the first element will be used
3: In if (Date >= Start_Date[i] & Date <= End_Date[i] & ID == ID1[i]) { :
  the condition has length > 1 and only the first element will be used

1 Ответ

1 голос
/ 28 февраля 2020

Вы можете merge и затем фильтровать строки, если они находятся в диапазоне:

subset(merge(df, df1, by.x = 'ID', by.y = 'ID1'), 
              Date >= Start_Date & Date <= End_Date)

#  ID       Date Start_Date   End_Date Result
#1  1 2012-01-01 2011-01-01 2018-12-31      A
#3  2 2015-02-01 2011-01-01 2019-12-31      B

Используя dplyr, это можно сделать так:

library(dplyr)
inner_join(df, df1, by = c('ID' = 'ID1')) %>%
   filter(Date >= Start_Date & Date <= End_Date)

Или с fuzzyjoin.

fuzzyjoin::fuzzy_inner_join(df, df1,  
      by = c('ID' = 'ID1', 'Date' = 'Start_Date', 'Date' = 'End_Date'), 
      match_fun = list(`==`, `>=`, `<=`))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...