подмножество фрейма данных R с использованием нескольких наборов дат

#r #dataframe #date #subset

#r #фрейм данных #Дата #подмножество

Вопрос:

У меня есть следующий набор данных:

  ID               dates                  d1                  d2                  d3                 d4
 X1 2007-09-09 09:00:00 2007-09-10 09:00:00 2007-09-11 09:00:00                 <NA>               <NA>
 X1 2007-09-10 09:00:00 2007-09-10 09:00:00 2007-09-11 09:00:00                 <NA>               <NA>
 X1 2007-09-11 09:00:00 2007-09-10 09:00:00 2007-09-11 09:00:00                 <NA>               <NA>
 X1 2007-09-13 09:00:00 2007-09-10 09:00:00 2007-09-11 09:00:00                 <NA>               <NA> 
 X2 2007-10-09 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
 X2 2007-10-10 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
 X2 2007-10-11 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
 X2 2007-10-14 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
 X2 2007-10-15 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
 X2 2007-10-20 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
  

Моя цель — разделить данные на два набора данных, например, один из них содержит все даты между d1 и d2 И между d3 и d4, а другой содержит все оставшиеся даты.

Вот как будет выглядеть результат:

data1 (даты между d1, d2, d3, d4):

 ID               dates                  d1                  d2                  d3                d4
X1 2007-09-10 09:00:00 2007-09-10 09:00:00 2007-09-11 09:00:00                <NA>                <NA>
X1 2007-09-11 09:00:00 2007-09-10 09:00:00 2007-09-11 09:00:00                <NA>                <NA>
X2 2007-10-09 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
X2 2007-10-10 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
X2 2007-10-14 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
X2 2007-10-15 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
  

data2 (оставшиеся даты):

 ID               dates                  d1                  d2                  d3                  d4
X1 2007-09-11 09:00:00 2007-09-10 09:00:00 2007-09-11 09:00:00                <NA>                <NA>
X1 2007-09-13 09:00:00 2007-09-10 09:00:00 2007-09-11 09:00:00                <NA>                <NA>
X2 2007-10-11 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
X2 2007-10-20 09:00:00 2007-10-08 09:00:00 2007-10-10 09:00:00 2007-10-13 09:00:00 2007-10-16 09:00:00
  

Был бы простой способ для меня сделать это?
Вот код для моего первого набора данных, чтобы вы могли его воспроизвести:

 ID<-rep(c("X1","X2"),times=c(4,6))
dates<-c("2007-09-09 09:00:00","2007-09-10 09:00:00","2007-09-11 09:00:00","2007-09-13 09:00:00","2007-10-09 09:00:00","2007-10-10 09:00:00","2007-10-11 09:00:00","2007-10-14 09:00:00", "2007-10-15 09:00:00","2007-10-20 09:00:00")
d1<-rep(c("2007-09-10 09:00:00","2007-10-08 09:00:00"),times=c(4,6))
d2<-rep(c("2007-09-11 09:00:00","2007-10-10 09:00:00"),times=c(4,6))
d3<-rep(c(NA,"2007-10-13 09:00:00"),times=c(4,6))
d4<-rep(c(NA,"2007-10-16 09:00:00"),times=c(4,6))
data<-data.frame(ID,dates,d1,d2,d3,d4)
  

Комментарии:

1. Неясно, что это за условие between d1 and d2 AND/OR d3 and d4, . Это для случаев, когда есть NA в d3, d4. предположим, у вас есть NA в d2, тогда между ними будет d1 и d3

2. Извините за неясность. d1 и d2 — это пары дат, подобные d3 и d4. Я не хочу никакого пересечения, например, d1-d3 или d2-d4. Если для столбцов d3 и d4 есть NA, то мне просто нужны даты между d1 и d2. Я также отредактировал вопрос выше, надеюсь, это имеет больше смысла!

3. Предположим, если в есть NA, d2 а ‘d1’ не является NA, тогда вы бы сравнили только d3 и d4

4. Учитывая характер моих данных, этого не произойдет. Либо оба d1 и d2 будут NA, либо ни один из них не будет. То же самое касается d3 и d4.

5. Это не сложно, как только вы преобразуете символьные строки в Date объекты, но ожидаемые результаты не соответствуют вашему описанию. В data1 первой строке: 2007-09-09 09:00:00 не находится между d1 и d2, 2007-09-10 09:00:00, 2007-09-11 09:00:00.

Ответ №1:

Сначала вам нужно будет преобразовать ваши даты из символов в Date объекты с помощью as.Date . Затем используйте dput() для предоставления данных в компактном формате для публикации:

 data <- structure(list(dates = structure(c(13765, 13766, 13767, 13769, 
13795, 13796, 13797, 13800, 13801, 13806), class = "Date"),
d1 = structure(c(13766, 13766, 13766, 13766, 13794, 13794, 13794, 13794,
13794, 13794), class = "Date"), d2 = structure(c(13767, 13767, 13767, 13767, 
13796, 13796, 13796, 13796, 13796, 13796), class = "Date"), d3 = structure(c(NA, 
NA, NA, NA, 13799, 13799, 13799, 13799, 13799, 13799), class = "Date"), 
d4 = structure(c(NA, NA, NA, NA, 13802, 13802, 13802, 13802, 
13802, 13802), class = "Date")), class = "data.frame", row.names = c(NA, -10L))
  

Теперь настройте критерии выбора и используйте их для создания data1 и data2 :

 select1 <- with(data, dates >= d1 amp; dates <= d2)
select2 <- with(data, dates >= d3 amp; dates <= d4)
select2 <- ifelse(is.na(select2), TRUE, select2)
select <- select1 amp; select2
(data1 <- data[select, ])
#        dates         d1         d2   d3   d4
# 2 2007-09-10 2007-09-10 2007-09-11 <NA> <NA>
# 3 2007-09-11 2007-09-10 2007-09-11 <NA> <NA>
(data2 <- data[!select,])
#        dates         d1         d2         d3         d4
# 1  2007-09-09 2007-09-10 2007-09-11       <NA>       <NA>
# 4  2007-09-13 2007-09-10 2007-09-11       <NA>       <NA>
# 5  2007-10-09 2007-10-08 2007-10-10 2007-10-13 2007-10-16
# 6  2007-10-10 2007-10-08 2007-10-10 2007-10-13 2007-10-16
# 7  2007-10-11 2007-10-08 2007-10-10 2007-10-13 2007-10-16
# 8  2007-10-14 2007-10-08 2007-10-10 2007-10-13 2007-10-16
# 9  2007-10-15 2007-10-08 2007-10-10 2007-10-13 2007-10-16
# 10 2007-10-20 2007-10-08 2007-10-10 2007-10-13 2007-10-16