将两个数据框与每日记录和每小时记录相结合

时间:2016-05-16 03:56:58

标签: r time dataframe

我有两个数据框:A

     y_m_d SNOW
    1 2010-01-01  0.0
    2 2010-01-02  0.0
    3 2010-01-03  0.1
    4 2010-01-04  0.0
    5 2010-01-05  0.0
    6 2010-01-06  2.3

B:

            time     temp

   1 2010-01-01 00:00:00 20.00000
   2 2010-01-01 01:00:00 18.33333
   3 2010-01-01 02:00:00 17.00000
   4 2010-01-01 03:00:00 25.33333
   5 2010-01-01 04:00:00 23.33333

我想根据时间组合两个数据框。 A是每日记录,B是每小时记录。我希望在每天00:00:00开始填写A记录,并将剩下的时间留空。 结果应如下所示:

            time          temp     SNOW
   1 2010-01-01 00:00:00 20.00000   0.0
   2 2010-01-01 01:00:00 18.33333
   3 2010-01-01 02:00:00 17.00000
   4 2010-01-01 03:00:00 25.33333
   5 2010-01-01 04:00:00 23.33333
   6 2010-01-01 05:00:00 22.66667
你可以给我一些建议吗? 谢谢。

2 个答案:

答案 0 :(得分:0)

这是一个快速解决方案:

A$y_m_d <- as.Date(A$y_m_d)
B$SNOW <- sapply(as.Date(B$time), function(x) A[A$y_m_d==x, "SNOW"])

答案 1 :(得分:0)

这可能不是世界上最有效的方法,但它是一种解决方案。我尝试使用与您完全相同的变量类型和结构来创建数据。

# Create example data
y_m_d <- as.POSIXct(c("2010-01-01", "2010-01-02"), format="%Y-%m-%d")
SNOW <- c(0, 0.1)
time <- as.POSIXct(c("2010-01-01 00:00:00", "2010-01-01 01:00:00", "2010-01-01 02:00:00", "2010-01-02 00:00:00", "2010-01-02 01:00:00", "2010-01-02 02:00:00"), format="%Y-%m-%d %H:%M:%S")
temp <- rnorm(6, mean=20, sd=4)
A <- data.frame(y_m_d, SNOW)
B <- data.frame(time, temp)

# Check data
A
##        y_m_d SNOW
## 1 2010-01-01  0.0
## 2 2010-01-02  0.1
B
##                  time     temp
## 1 2010-01-01 00:00:00 17.52852
## 2 2010-01-01 01:00:00 12.42715
## 3 2010-01-01 02:00:00 21.79584
## 4 2010-01-02 00:00:00 19.90442
## 5 2010-01-02 01:00:00 16.40524
## 6 2010-01-02 02:00:00 16.86854

# Loop through days and construct new SNOW variable
days <- as.POSIXct(format(B$time, "%Y-%m-%d"), format="%Y-%m-%d")
SNOW_new <- c()
for (i in 1:nrow(A)) {
    SNOW_new <- c(A[i, "SNOW"], rep(NA, sum(days==A[i, "y_m_d"])-1), SNOW_new)
    }

# Create new data frame
C <- data.frame(B, SNOW_new)
##                  time     temp SNOW_new
## 1 2010-01-01 00:00:00 17.52852      0.1
## 2 2010-01-01 01:00:00 12.42715       NA
## 3 2010-01-01 02:00:00 21.79584       NA
## 4 2010-01-02 00:00:00 19.90442      0.0
## 5 2010-01-02 01:00:00 16.40524       NA
## 6 2010-01-02 02:00:00 16.86854       NA

我放NA而不是空格,因为我假设您希望SNOW_new变量是数字,而不是字符。但是,如果您确实需要空格,则可以使用NA替换rep函数中的""