Удаление дублированных строк из слияния двух фреймов данных в r по дате / времени

#r #date

#r #Дата

Вопрос:

Я объединил два фрейма данных по дате и времени в R (по дате и времени). Один фрейм данных представляет собой простую последовательность, а другой содержит данные для 6242 obs, но мне нужны данные за каждый час (даже если он равен нулю)

Когда я объединил, мой результат дублировал строки, которые совпадали, вместо того, чтобы вставлять их. Есть ли дополнение к функции слияния, которое я могу использовать для сохранения ВСЕХ строк, но не тех, в которых дублируются даты без информации? т.е. я хочу строку 1933, А НЕ 1934.

 x <- data.frame (DateTime = seq(as.POSIXct("1986-01-01"),
                            as.POSIXct("2012-04-27"),
                            by=(3600)))
y <- read.csv("TS1.csv", header = FALSE, as.is = TRUE)
names(y) <- c("Date", "Time", "Rainfall")

y$Station<- rep("D1253",length(6242))

#reformat so date is the same
y$Date <- as.Date(y$Date, format = "%m/%d/%Y")
y$DateTime <-  paste(y$Date, y$Time, sep=" ")

>head(y)
    Date  Time Rainfall Station         DateTime
1 1986-01-01 21:00     0.01   D1253 1986-01-01 21:00
2 1986-01-02  9:00     0.01   D1253  1986-01-02 9:00
3 1986-01-02 10:00     0.01   D1253 1986-01-02 10:00
4 1986-01-02 11:00     0.01   D1253 1986-01-02 11:00
5 1986-01-02 12:00     0.01   D1253 1986-01-02 12:00
6 1986-01-02 13:00     0.01   D1253 1986-01-02 13:00

#Combine datasets 
z<- merge(x, y, by='DateTime', all=TRUE) #the all.x=TRUE gives me all NAs

z$Rainfall[is.na(z$Rainfall)] <- 0.00

> head(z)
             DateTime      Date     Time     Rainfall Station
1933   1986-03-14 18:00:00 1986-03-14 18:00     0.01   D1253
1934   1986-03-14 19:00:00       <NA>  <NA>     0.00    <NA>
1935   1986-03-14 19:00:00 1986-03-14 19:00     0.01   D1253
1936   1986-03-14 20:00:00       <NA>  <NA>     0.00    <NA>
1937   1986-03-14 20:00:00 1986-03-14 20:00     0.01   D1253
1938   1986-03-14 21:00:00       <NA>  <NA>     0.00    <NA>
1939   1986-03-14 21:00:00 1986-03-14 21:00     0.09   D1253
1940   1986-03-14 22:00:00       <NA>  <NA>     0.00    <NA>
1941   1986-03-14 22:00:00 1986-03-14 22:00     0.02   D1253
1942   1986-03-14 23:00:00       <NA>  <NA>     0.00    <NA>
 

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

1. у нас нет TS1.csv . Пожалуйста, сделайте dput(y) , а затем в вашей проблеме с постановкой задачи как y <- whateverThatdputIs

2. кроме того, посмотрите на dplyr::left_join()

3. почему вы это делаете y$Station <- rep("D1253", length(6242) ? Это то же самое, что и выполнение rep("D1253",1)

4. Я думаю, что нужно сделать слишком много данных dput(y) ? 6242 конкретных строки

Ответ №1:

all.x = TRUE — правильный способ сделать это:

 z <- merge(x, y, by='DateTime', all.x = TRUE)
z[is.na(z)] <- 0 # Fill in the NA's with 0 for the hours with no data
 

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

1. all.x=TRUE возвращает правильное количество строк, но предоставляет все NAS для данных об осадках.

2. да, тогда вторая строка заполняет эти NA с 0.

3. Да, но все данные хранятся в NAs. Данные об осадках из фрейма данных y не объединяются.

Ответ №2:

Обе даты должны быть отформатированы одинаково с использованием as.POSIXct

Как только это будет сделано, слияние будет выполнено правильно с помощью all.x=TRUE