【问题标题】:Subsetting a data frame by specific dates after using as.character(as.Date()) to convert original factor variable Date column使用 as.character(as.Date()) 转换原始因子变量 Date 列后按特定日期对数据框进行子集
【发布时间】:2019-09-17 17:54:06
【问题描述】:

我对 R 非常陌生,正在尝试一些练习题。我有一个大型数据集,我需要从中按日期范围创建一个较小的数据集。我很难这样做,这可能是因为我对这些 R 命令的作用没有很好的理解。

这里是数据集rawdata的前六行:

Date     Time Global_active_power Global_reactive_power Voltage
1 16/12/2006 17:24:00               4.216                 0.418 234.840
2 16/12/2006 17:25:00               5.360                 0.436 233.630
3 16/12/2006 17:26:00               5.374                 0.498 233.290
4 16/12/2006 17:27:00               5.388                 0.502 233.740
5 16/12/2006 17:28:00               3.666                 0.528 235.680
6 16/12/2006 17:29:00               3.520                 0.522 235.020
  Global_intensity Sub_metering_1 Sub_metering_2 Sub_metering_3
1           18.400          0.000          1.000             17
2           23.000          0.000          1.000             16
3           23.000          0.000          2.000             17
4           23.000          0.000          1.000             17
5           15.800          0.000          1.000             17
6           15.000          0.000          2.000             17

我想创建此数据的子集,其中日期从 2007 年 2 月 1 日到 2007 年 2 月 2 日。

this thread,我发现建议先运行 as.Date 函数(如果需要,还可以运行 as.character 函数),然后运行一个子集函数。

首先,我使用 as.character(rawdata$Date) 将“日期”列从因子转换为字符。意识到这会生成一个完整的数据列表,我将它分配给对象 CharDate,如下所示:

CharDate <- as.character(rawdata$Date)

然后,我再次使用 as.Date 转换数据,打算使用它来子集我的原始数据,并将其分配给 DateasDate。

DateasDate <- as.Date(CharDate, "%d/%m/%y")

此时,我很困惑如何使用它来对我的原始文件rawdata 进行子集化,因为DateasDate 不是一个新变量吗?我是否必须将DateasDate 作为列添加到rawdata?有什么方法可以直接更改rawdata 中的日期列,这样我就不必这样做了?

任何帮助将不胜感激!

【问题讨论】:

  • @RonakShah 对此感到非常抱歉,我已经对其进行了编辑,希望这更有意义!

标签: r dataframe subset as.date


【解决方案1】:

您可以先将Date 对象转换为实际日期,然后再将subset 转换为数据框。

df$Date <- as.Date(df$Date, "%d/%m/%Y")
subset(df, Date >= as.Date("2007-01-02") & Date <= as.Date("2007-02-02"))

或者使用与dplyr相同的逻辑

library(dplyr)

df %>%
  mutate(Date = as.Date(Date, "%d/%m/%Y") %>%
  filter(Date >= as.Date("2007-01-02") & Date <= as.Date("2007-02-02"))

【讨论】:

  • 感谢您的建议!我从来不知道我可以通过这种方式为变量分配函数来修改变量,这真的很有帮助!第一行 df$Date &lt;- as.Date(df$Date, "%d/"%m/%y") 运行良好,但子集函数不起作用,生成一条错误消息,内容为“charToDate(x) 中的错误:字符串不是标准的明确格式”。
  • @abbylim 您错误地复制了第一行。你能做df$Date &lt;- as.Date(df$Date, "%d/%m/%Y")然后检查。请特别注意"%d/%m/%Y"
  • 啊!修复后不再有错误消息,但子集最终是一个空数据框,有 0 行?当我尝试做subset(rawdata, Date == as.Date("2007-02-01") | Date == as.Date("2007-02-02"))时发生了同样的事情。
  • 奇怪..你能告诉我当你做 1)class(rawdata$Date),2)min(rawdata$Date) 和 3)max(rawdata$Date) 时你得到什么输出?
  • 很抱歉,我意识到这是因为我输入的是“2002-02-02”而不是“2002-2-2”......非常感谢您的所有耐心和帮助!!!
猜你喜欢
  • 2023-04-06
  • 2018-04-04
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多