r - 如何将带有时间戳的字符列转换为用于 R 中计算的有用格式
问题描述
我有两个数据框,每个数据框都有一个字符格式的“TIMESTAMP”列
我想将数据框添加在一起,因为它们具有完全相同的结构。
一个数据框包含 2000 年到 2003 年的数据,另一个数据框包含 2002 年到 2010 年的数据,因此它们具有相同的 2002 年和 2003 年数据。当我将它们合并时,我希望 2002 年和 2003 年没有重复。
我有什么可能性?我试过newdata <- rbind(data1, data2)
了,但在这里我得到了重复项。
是否有可能只添加不会重复的“TIMESTAMP”?
前:
TIMESTAMP PRICE AMOUNT
2000-01-15 10:15:00 15 120
2002-05-05 17:15:00 20 100
2003-03-14 12:30:00 22 170
TIMESTAMP PRICE AMOUNT
2003-03-14 12:30:00 22 170
2007-12-10 11:55:00 30 200
2010-10-05 12:10:00 44 240
如您所见2003-03-14 12:30:00
,两个数据框中的内容相同。
我想要这样的输出:
TIMESTAMP PRICE AMOUNT
2000-01-15 10:15:00 15 120
2002-05-05 17:15:00 20 100
2003-03-14 12:30:00 22 170
2007-12-10 11:55:00 30 200
2010-10-05 12:10:00 44 240
我想用这些数据做一个事件研究,所以我认为日期时间格式是这个标准还是我错了?
解决方案
这取决于。
如果您想仅基于 删除重复项TIMESTAMP
,则
## base R
rbind(dat1, subset(dat2, !TIMESTAMP %in% dat1$TIMESTAMP))
# TIMESTAMP PRICE AMOUNT
# 1 2000-01-15 10:15:00 15 120
# 2 2002-05-05 17:15:00 20 100
# 3 2003-03-14 12:30:00 22 170
# 21 2007-12-10 11:55:00 30 200
# 31 2010-10-05 12:10:00 44 240
## dplyr
library(dplyr)
filter(dat2, !TIMESTAMP %in% dat1$TIMESTAMP) %>%
bind_rows(dat1, .)
如果您希望它基于整行相同(例如,您可能有两个相同TIMESTAMP
但具有不同的值),那么您可以这样做
## base R
dat12 <- rbind(dat1, dat2)
dat12[!duplicated(dat12),]
# TIMESTAMP PRICE AMOUNT
# 1 2000-01-15 10:15:00 15 120
# 2 2002-05-05 17:15:00 20 100
# 3 2003-03-14 12:30:00 22 170
# 5 2007-12-10 11:55:00 30 200
# 6 2010-10-05 12:10:00 44 240
## dplyr
bind_rows(dat1, dat2) %>%
filter(!duplicated(.))
注意:这些都不是TIMESTAMP
字符串以外的任何东西;对于这些操作,这可能没问题。最终,如果您将使用时间戳(即时差)做类似数字的事情,那么您需要将它们转换POSIXt
为
## base R
dat12$TIMESTAMP <- as.POSIXct(dat12$TIMESTAMP)
## dplyr
dat12 <- mutate(dat12, TIMESTAMP = as.POSIXct(TIMESTAMP))
尽管这带来了一个明显的问题:如果其中任何一个包含亚秒级,那么查找重复项可能会有问题。因为它们在内部存储为numeric
(带有类),所以浮点相等存在一个已知问题。有关这方面的示例,请参阅为什么这些数字不相等?,浮点数学有问题吗?,和https://en.wikipedia.org/wiki/IEEE_754。只要您的数据通常具有不小于秒的分辨率,您可能永远不会遇到问题。浮点相等的问题在于它从来都不是警告或错误,所以即使你有一个,你也可能看不到它。您唯一的指示可能是数据中出现重复项。
注意 2:R 在控制台上打印时间时默认为“秒”分辨率,但这并不意味着数据中没有毫秒。
now <- Sys.time()
now
# [1] "2021-08-27 12:16:58 EDT"
options(digits.secs = 3)
now
# [1] "2021-08-27 12:16:58.539 EDT"
我没有改变now
,这只是控制台上如何打印数据的问题,而不是数据实际包含的内容。
要在转换为POSIXt
-class 后解决重复数据删除问题,如果您在任何地方都具有亚秒级精度,那么您需要采取更多步骤才能确信它正在做您需要的事情。(这个答案可能太多了。)
数据
dat1 <- structure(list(TIMESTAMP = c("2000-01-15 10:15:00", "2002-05-05 17:15:00", "2003-03-14 12:30:00"), PRICE = c(15L, 20L, 22L), AMOUNT = c(120L, 100L, 170L)), row.names = c(NA, -3L), class = "data.frame")
dat2 <- structure(list(TIMESTAMP = c("2003-03-14 12:30:00", "2007-12-10 11:55:00", "2010-10-05 12:10:00"), PRICE = c(22L, 30L, 44L), AMOUNT = c(170L, 200L, 240L)), row.names = c(NA, -3L), class = "data.frame")
推荐阅读
- r - RStudio Server + Shiny - [没有可用的堆栈跟踪]
- git - Visual Studio Git Changes 在启动时加载我的所有计算机文件
- string - 在 unix 变量中存储转义字符
- bootstrap-4 - 如何在 Bootstrap 中使用 Appbar
- git - 吉特。无法返回提交
- vba - 如何验证数据是否存在于带有外部变量的记录集中?VBA
- javascript - 错误不变违规:不支持动态更改 onViewableItemsChanged
- go - 如何在结构中使用结构?无效的内存地址或 nil 指针取消引用
- vba - 如何在 vba 中使用新密码保存 Excel 文件
- laravel - Laravel 队列和 Azure WebJob