【问题标题】:Subset dataframe in r for a specific month and dater 中特定月份和日期的子集数据框
【发布时间】:2018-08-09 19:17:10
【问题描述】:

我有一个如下所示的数据框:

V1 V2 V3 Month_nr Date
 1 2   3  1  2017-01-01
 3 5   6  1  2017-01-02
 6 8   9  2  2017-02-01
 6 8   9  8  2017-08-01

我想从数据集中获取月份=1(一月)和日期从 2017 年 1 月 1 日到 2017 年 1 月 31 日(所以一月底)的所有变量,这意味着我想取日期也是如此。我会创建一个包含天数的列,但我一天有多个观察结果,这会更加令人困惑。我试过了:

df<- filter(df,df$Month_nr == 1, df$Date > 2017-01-01 && df$Date < 2017-01-31)

但它不起作用。非常感谢您的帮助!在这一点上我很绝望。我的数据集包含一整年(从 1 到 12)的测量值,因此我过滤了几个月。

【问题讨论】:

    标签: r dataframe time subset


    【解决方案1】:

    问题是你没有在 2017-01-01 前后加上引号。直接输入 2017-01-01 将计算减法并返回一个数字,然后将字符串与数字进行比较。您可以将字符串与字符串进行比较;对于字符串,“2”仍然大于“1”,因此可以将日期作为字符串进行比较。 BTW,使用filter时不需要写df$;使用 tidyverse 时,您可以直接编写列名而无需引用。

    【讨论】:

    • 非常感谢您的快速响应。班级是因素。我想问一下整个命令会是什么样子?抱歉,我对 R 很陌生,还在学习。
    • df&lt;- filter(df, Month_nr == 1, Date &gt; "2017-01-01" &amp; Date &lt; "2017-01-31")
    • 顺便说一句,不要在过滤器中使用&amp;&amp;,而是使用&amp;&amp;&amp;|| 仅用于 if 语句并进行短路评估。 &amp; 比较两个向量元素,而&amp;&amp; 只比较两个向量的第一个元素。
    • 非常感谢!我刚试了一下,我得到了:Warning messages: 1: In Ops.factor(Date, "2017-01-01") : ‘&gt;’ not meaningful for factors 2: In Ops.factor(Date, "2017-01-31") : ‘&lt;’ not meaningful for factors
    • 我明白了。我也经常忘记这一点。您应该将Date 列转换为df &lt;- df %&gt;% mutate(Date = as.character(Date)) 的字符。然后就可以比较了。还有一点要注意,当你用data.frame构造数据框时,记得放参数stringsAsFactor = FALSE,防止R把字符串转换成因子。或者在构造数据框的时候可以使用tibble
    【解决方案2】:

    为什么需要在过滤器中同时包含月份和日期?只是日期上的过滤器可以正常工作。但是,您必须将日期列转换为日期对象。你可以这样做:

    df$Date_nr <- as.Date(df$Date_nr, format = "%Y-%m-%d")
    df_new <- subset(df, Date_nr >= "2017-01-01" & Date_nr <= "2017-01-31")
    

    【讨论】:

    • 非常感谢您的快速响应。我忘了提,但我正在过滤月份==1,因为我有整整一年和更多月份的数据。如果您能帮助我同时按月份和日期对它进行细分,我将不胜感激。谢谢
    • 我的意思是通过过滤日期范围,月份不会被处理吗?前任。在这种情况下,您正在过滤 1 月 1 日至 1 月 31 日之间的日期,因此默认情况下您满足月份 = 1 条件
    • 如果您的日期范围发生变化并且包含超过 1 个月的日期,则将月份 = 1 条件保留在子集中会产生问题
    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2018-11-22
    • 2013-02-15
    相关资源
    最近更新 更多