【问题标题】:Remove duplicated rows from a Merge of two dataframes in r by Date/TIme按日期/时间从 r 中两个数据帧的合并中删除重复的行
【发布时间】:2017-02-23 23:49:20
【问题描述】:

我在 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>

【问题讨论】:

  • 我们没有TS1.csv。请做dput(y),然后在你的问题陈述问题中作为y &lt;- whateverThatdputIs
  • 另外,请查看dplyr::left_join()
  • 你为什么要y$Station &lt;- rep("D1253", length(6242)?这和rep("D1253",1)一样
  • 我觉得有太多数据要做dput(y)? 6242 特定行

标签: r date


【解决方案1】:

两个日期的格式必须相同,使用as.POSIXct

完成后,使用all.x=TRUE 正确完成合并

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

    • all.x=TRUE 返回正确的行数,但提供降雨数据的所有 NA。
    • 是的,然后第二行用 0 填充那些 NA。
    • 是的,但所有数据都是 NA。它不会合并来自数据框 y 的降雨数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2018-06-09
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多