为什么 rbind 在追加到数据框时会更改一个值?

问题描述 投票:0回答:1

我正在处理日期时间和时区的向量。一些时区记录不正确,我想调整时间以适应正确的时区。我想输出一个数据框。看来,当将行附加到输出数据帧时,rbind 更改了观察之一中变量之一的值。这是示例代码和显示问题的输出。

toy_problem <- function(){
  require("tidyverse")
   
  DateTime  <- c("2001-04-06 01:20:00",   # Input dates and times
                 "2001-04-05 19:20:00",
                 "2001-04-05 16:00:00",
                 "2001-04-06 01:15:00")
  listZones <- c("America/Chicago",       # Input time zones
                  "America/Chicago",
                  "America/Chicago",
                  "America/Chicago")
  trueZones  <- c("America/Detroit",      # Correct time zones
                  "America/Detroit",
                  "America/Chicago",
                  "America/Detroit")
  
  # Create an empty data frame
  
  outFrame   <- data.frame(inTime=NULL, outTime=NULL)
  
  for (i in 1:4) {                                        # Loop through the observations
   tReg        <- ymd_hms(DateTime[i], tz=listZones[i])   # Iinput date/time to POSIXct
   localTime   <- with_tz(tReg,tzone=trueZones[i])        # Fix the time to fit the correct TZ
   print(tReg)                                            # Starting date/time
   print(localTime)                                       # Adusted date/time adjusted
   
   # Put the observation into a one-line data frame
   
   thisFrame   <- data.frame(inTime=tReg, outTime=localTime)
   print(str(thisFrame))                                  # Check the one-line data frame
   outFrame    <- rbind(outFrame,thisFrame)               # Append to the ouput frame
  }
  print(outFrame)                                         # Print the output data frame
}

这是带注释的输出:

[1] "2001-04-06 01:20:00 CDT"
[1] "2001-04-06 02:20:00 EDT"                             # Correct
'data.frame':   1 obs. of  2 variables:                   # Looks good
 $ inTime : POSIXct, format: "2001-04-06 01:20:00"
 $ outTime: POSIXct, format: "2001-04-06 02:20:00"
NULL
[1] "2001-04-05 19:20:00 CDT"                             
[1] "2001-04-05 20:20:00 EDT"                             # Correct
'data.frame':   1 obs. of  2 variables:                   # Looks good
 $ inTime : POSIXct, format: "2001-04-05 19:20:00"
 $ outTime: POSIXct, format: "2001-04-05 20:20:00"
NULL
[1] "2001-04-05 16:00:00 CDT"                      
[1] "2001-04-05 16:00:00 CDT"                             # Correct!!!!
'data.frame':   1 obs. of  2 variables:                   # Looks good!!!
 $ inTime : POSIXct, format: "2001-04-05 16:00:00"
 $ outTime: POSIXct, format: "2001-04-05 16:00:00"
NULL
[1] "2001-04-06 01:15:00 CDT"
[1] "2001-04-06 02:15:00 EDT"                             # Correct
'data.frame':   1 obs. of  2 variables:                   # Looks good
 $ inTime : POSIXct, format: "2001-04-06 01:15:00"
 $ outTime: POSIXct, format: "2001-04-06 02:15:00"
NULL
               inTime             outTime
1 2001-04-06 01:20:00 2001-04-06 02:20:00                 # Correct
2 2001-04-05 19:20:00 2001-04-05 20:20:00                 # Correct
3 2001-04-05 16:00:00 2001-04-05 17:00:00                 # WRONG!!!!!!
4 2001-04-06 01:15:00 2001-04-06 02:15:00                 # Correct

我不明白为什么这个值在附加到输出数据帧时会被更改。

lubridate posixct rbind
1个回答
0
投票

迈克的评论是正确的。 rbind 强制类,因此第一个条目的类被转移到所有其他条目。一个条目被更改的原因是它的类与放入输出数据帧中的第一个条目不同。

© www.soinside.com 2019 - 2024. All rights reserved.