【问题标题】:Subsetting Dates and Times Across Multiple Data Frames in R在 R 中跨多个数据框设置日期和时间的子集
【发布时间】:2015-05-19 23:12:16
【问题描述】:

我是 R 新手,所以这很可能是一个简单的问题,但它给我带来了很多困难。

我试图在跨数据帧找到的两个值之间进行子集化,但在尝试在这两个值之间进行子集化时遇到了困难。我将首先描述我做了什么,什么是有效的,然后什么是无效的。

我有两个数据框。一个具有一系列风暴数据,包括风暴事件的日期,另一个具有与数千个监测事件的排放量相对应的一系列数据。我正在尝试查看是否有任何排放数据在风暴事件开始和结束日期/时间内对应。

到目前为止我所做的如下:

放电数据示例:

    X.  DateTime        Depth   DateTime1           newcol
1   3   8/2/2013 13:15  0.038   2013-08-02 13:15:00 1375463700
2   4   8/2/2013 13:30  0.038   2013-08-02 13:30:00 1375464600
3   5   8/2/2013 13:45  0.039   2013-08-02 13:45:00 1375465500
4   6   8/2/2013 14:00  0.039   2013-08-02 14:00:00 1375466400

风暴数据示例:

    Storm newStart  newEnd
1   1   1382125500  1382130000
2   2   1385768100  1385794200

#Make a value to which the csv files are attached
CA_Storms <- read.csv(file = "CA_Storms.csv", header = TRUE, stringsAsFactors = FALSE)
CA_adj <- read.csv(file = "CA_Adj.csv", header = TRUE, stringsAsFactors = FALSE)

#strptime function (do this for all data sets)
CA_adj$DateTime1 <- strptime(CA_adj$DateTime, format = "%m/%d/%Y %H:%M")
CA_Storms$Start.time1 <- strptime(CA_Storms$Start.time, format = "%m/%d/%Y %H:%M")
CA_Storms$End.time1 <- strptime(CA_Storms$End.time, format = "%m/%d/%Y %H:%M")

#Make dates and times continuous
CA_adj$newcol <- as.numeric(CA_adj$DateTime1)
CA_Storms$newStart <- as.numeric(CA_Storms$Start.time1)
CA_Storms$newEnd <- as.numeric(CA_Storms$End.time1)

这让我可以成功地完成以下子集:

    CA_adj[CA_adj$newcol == "1375463700", ]

Example output:   
 X.       DateTime Depth           DateTime1     newcol
    1  3 8/2/2013 13:15 0.038 2013-08-02 13:15:00 1375463700

CA_adj[CA_adj$newcol == CA_Storms[1,19], ]

 X.       DateTime         Depth  DateTime1           newcol
7403 7408 10/18/2013 15:45 0.058 2013-10-18 15:45:00 1382125500

CA_adj[CA_adj$newcol <= CA_Storms[1,20], ]

但是,每当我尝试让它在两个值之间移动时,例如:

CA_adj[CA_adj$newcol &gt;= CA_Storms[1,19] &amp; CA_adj$newol &lt;= CA_Storms[1,20], ]

它会这样回应:

[1] X.        DateTime  Depth     DateTime1 newcol   
<0 rows> (or 0-length row.names)

我知道这个输出是不正确的,因为通过粗略查看我的大型数据集,至少有一个值符合这些标准。

什么给了?

【问题讨论】:

  • 请发布示例数据和所需的输出。
  • 不是CA_adj[CA_adj$newcol &gt;= CA_Storms[1,19] | CA_adj$newol &lt;= CA_Storms[1,20], ]你想要的吗?
  • @Soheil 谢谢你的建议。我已经编辑了帖子,所以现在添加了这些内容。
  • @Robert 我已经尝试过了,它产生了相同的结果。另外,我想我希望它是&,是的,因为我正在寻找在这两个值之间的日期/时间存在哪些放电期并且不排除在它们之外?
  • CA_adj[CA_adj$newcol == CA_Storms[1,19], ] 你得到了什么?第 1 行和第 19 列?

标签: r datetime dataframe subset


【解决方案1】:
discharge<-data.frame( x=c(3,4,5,6),
                       DateTime=c("8/2/2013 13:15","8/2/2013 13:30",
                                  "8/2/2013 13:45","8/2/2013 14:00"),
                       Depth=c(0.038, 0.038, 0.039, 0.039)
                     ) 
 discharge$DateTime1<- as.POSIXct(discharge$DateTime, format = "%m/%d/%Y %H:%M")

storm<-data.frame( storm=c(1,2),
                   start=c("8/2/2013 13:15","8/2/2013 16:30"),
                   end=c("8/2/2013 13:45","8/2/2013 16:45")
                 )

 storm$start<- as.POSIXct(storm$start, format = "%m/%d/%Y %H:%M")
 storm$end<- as.POSIXct(storm$end, format = "%m/%d/%Y %H:%M")


discharge[(discharge$DateTime1>=storm[1,2] & discharge$DateTime1<=storm[1,3]),]

【讨论】:

    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多