#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 и d32. Извините за неясность. d1 и d2 — это пары дат, подобные d3 и d4. Я не хочу никакого пересечения, например, d1-d3 или d2-d4. Если для столбцов d3 и d4 есть NA, то мне просто нужны даты между d1 и d2. Я также отредактировал вопрос выше, надеюсь, это имеет больше смысла!
3. Предположим, если в есть NA,
d2
а ‘d1’ не является NA, тогда вы бы сравнили только d3 и d44. Учитывая характер моих данных, этого не произойдет. Либо оба 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