【问题标题】:Subsetting a data by date range/days in R在 R 中按日期范围/天对数据进行子集化
【发布时间】:2014-06-03 21:05:19
【问题描述】:

我正在尝试从我的数据集中的“日期”变量中仅从以下特定工作日“周四”、“周五”和“周六”中提取数据。

> head(tidyFile)
            Date     Time Global_active_power Global_reactive_power Voltage Global_intensity
66637 2007-02-01 00:00:00               0.326                 0.128  243.15              1.4
66638 2007-02-01 00:01:00               0.326                 0.130  243.32              1.4
66639 2007-02-01 00:02:00               0.324                 0.132  243.51              1.4
66640 2007-02-01 00:03:00               0.324                 0.134  243.90              1.4
66641 2007-02-01 00:04:00               0.322                 0.130  243.16              1.4
66642 2007-02-01 00:05:00               0.320                 0.126  242.29              1.4
      Sub_metering_1 Sub_metering_2 Sub_metering_3
66637              0              0              0
66638              0              0              0
66639              0              0              0
66640              0              0              0
66641              0              0              0
66642              0              0              0

我使用以下代码在我需要的日期范围之间划分子集:

tidyFile <- newFile[newFile$Date >= "2007-02-01" & newFile$Date <= "2007-02-02", ] 

但是我子集的方式可能有问题,因为当我在这个子集中调用“Thurs”、“Fri”和“Sat”时,我得到了 NA 值,这是不对的。我是否应该与时俱进,以确保我包含上述日期?

最后,我需要按“星期四”、“星期五”和“星期六”进一步对数据进行子集化,但我似乎无法做到这一点。我尝试了以下方法:

library(lubridate)
with(tidyFile[wday(tidyFile, label=T) == "Thurs" & "Fri" & "Sat"])

返回错误信息:

Error in wday(tidyFile, label = T) : unused argument (label = T)

更新

这些是我创建脚本所采取的步骤:

## STEP 1: Set working directory
setwd("/Users/usaid/datasciencecoursera/data/") 

## STEP 2: Create a new object 'newFile' and read .txt file into R
newFile <- read.table("course_4_proj_1.txt", header=TRUE, sep=";", na.strings = "?", nrows= 1000000, stringsAsFactors=FALSE,  as.is=TRUE)  

## STEP 3: Create a new object 'newFile$Date' and format dates (into date class)
newFile$Date <- as.Date(newFile$Date, format = "%d/%m/%Y") 
newFile$Date <- strptime(newFile$Date, format = "%d/%m/%Y", tz = "")

## STEP 4: Create a new object 'tidyFile' and subset data based on date range provided in Project 1 instructions
tidyFile <- newFile[newFile$Date >= "2007-02-01" & newFile$Date <= "2007-02-02", ] 

## STEP 5: Subset data by "Thurs", "Fri", "Sat"
library(lubridate)
with(tidyFile, wday(Date, label = TRUE))
days <- with(tidyFile, wday(Date, label = TRUE) %in% c("Thurs","Fri","Sat"))
tidyFile[days, ]

当我运行第 5 步时,我收到下面提到的错误消息。

【问题讨论】:

  • 您的布尔条件不正确。你可能想使用%in%
  • %in% 会包含在上面的代码中的什么地方?
  • 如果您想要周四、周五或周六的任何一个工作日,请... %in% c("Thurs","Fri","Sat")
  • 我明白了。但我想要所有三个工作日的数据。
  • 您已经循环了各种不同的错误代码,其中一些我什至还没有触及。您的 with 语法不正确。您最后一次尝试修复您对%in% 的使用从根本上改变了括号的位置。我认为你真的需要回去学习一些基本的 R 教程和手册。

标签: r date subset


【解决方案1】:

这对甩尾有帮助吗?

## snippet of your data, not all columns
dat <- read.table(text = "            Date     Time Global_active_power Global_reactive_power Voltage Global_intensity
66637 2007-02-01 00:00:00               0.326                 0.128  243.15              1.4
66638 2007-02-01 00:01:00               0.326                 0.130  243.32              1.4
66639 2007-02-01 00:02:00               0.324                 0.132  243.51              1.4
66640 2007-02-01 00:03:00               0.324                 0.134  243.90              1.4
66641 2007-02-01 00:04:00               0.322                 0.130  243.16              1.4
66642 2007-02-01 00:05:00               0.320                 0.126  242.29              1.4
", header = TRUE)

## Make Date an actual Date
dat <- transform(dat, Date = as.Date(Date))
## Load lubridate
require("lubridate")

获取wday() 以返回Date 的星期几:

with(dat, wday(Date, label = TRUE))

现在我们需要添加与您列出的选项的比较。这是使用%in% 二元运算符完成的。 %in% 的右侧需要一个要匹配的向量,因此您需要将 c("Thurs", "Fri", "Sat") 放在 %in% 的右侧,如下所示:

with(dat, wday(Date, label = TRUE) %in% c("Thurs","Fri","Sat"))

通过你展示的数据的 sn-p,你得到了

> with(dat, wday(Date, label = TRUE) %in% c("Thurs","Fri","Sat"))
[1] TRUE TRUE TRUE TRUE TRUE TRUE

要完成,你需要类似的东西

take <- with(dat, wday(Date, label = TRUE) %in% c("Thurs","Fri","Sat"))
dat[take, ]

这种情况是全部,但我认为在你的真实数据集中你比这几条记录更多。

【讨论】:

  • 当我到达 with(dat, wday(Date, label = TRUE)) 时,我收到以下消息 Error in wday(Date, label = TRUE) : unused argument (label = TRUE)
  • sigh 确认您使用的是lubridate::wday()?wday 告诉你什么? label 函数的一个参数,至少在我刚从 CRAN 安装的版本中。您是否正在运行该软件包的最新版本?如您所见(我给出了一个可重现的示例并包含代码和生成的输出),这确实有效!
  • 好的,现在可以了!我认为这是我试图加载 lubridate 的方式。我需要比较两个变量:x(用电量)按天(周四、周五、周六)。根据我们上面所做的,我如何称呼“周四”、“周五”、“周六”?抱歉,我太密集了,但我正在学习。
  • 你没有学习;关于 R 或Stack Overflow。您的数据中没有 x。 “我如何称呼'星期四','星期五','星期六'”是什么意思?听起来您需要在 Stack Overflow 上提出一个新问题,但请考虑您是否应该按照 @joran 的建议去做并先回顾一些介绍性 R 材料?
  • 对不起。 “x”只是变量的通用术语。实际变量是上面数据集中的 Global_active_power。我想根据日期变量绘制该变量的值,但将日期子集化为仅包含“星期四”、“星期五”、“星期六”的数据。我认为这是一个更好的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2017-05-12
  • 2018-12-29
  • 1970-01-01
  • 2013-10-25
  • 2014-11-15
  • 1970-01-01
相关资源
最近更新 更多