【问题标题】:Subset a dataframe based on numerical values of a string inside a variable根据变量内字符串的数值对数据框进行子集
【发布时间】:2019-11-13 02:49:01
【问题描述】:

我有一个数据框,它是从 1961 年到 2018 年每月分辨率的气象测量时间序列。我对测量月平均温度的变量感兴趣,因为我需要夏季的多年平均温度。

为此,我必须从“DateVaraible”列中过滤第五和第六位数字,即月份。 时间列中的值的格式如下 “19610701”。所以我需要1961年之后的07(七月)。

我开始为其他目的编码 1 个月,所以我没有尝试任何值得一提的事情。我想 .grepl 可以完成这项工作,但我不知道“匹配”运算符是如何工作的。

所以我开始使用这个有效的代码。

summersmonth<- Df[DateVariable %like% "19610101" I DateVariable %like% "19610201"]

我期待这样的代码

summermonths <- Df[DateVariable %like% "**06**" I DateVariable%like% "**07**..]

这样所有月份数字从 06 到 09 的条目都保存在新的数据框 summermonths 中。

提前感谢您对我的问题的任何回复或反馈。

更新

感谢您的回答,我得到了第一部分,即将变量转换为 as.date 格式为“月”(Class=char) 现在我需要选择从 Juni 到 September 的月份。 获得我想要的结果的一种可怕方法是在之后执行几个subset 和一个rbind

Sommer1<-subset(Df, MonthVar == "Mai")
Sommer2<-subset(Df, MonthVar == "Juli")
Sommer3<-subset(Df, MonthVar == "September")

SummerTotal<-rbind(Sommer1,Sommer2,Sommer3)

我会很高兴看到这篇文章以整洁的方式编写。

更新 2 - 解决方案

这里是整洁的方式,就像这里Using multiple criteria in subset function and logical operators

Veg_Seas<-subset(Df, subset = MonthVar %in% c("Mai","Juni","Juli","August","September"))

【问题讨论】:

  • 如果DateVariable 总是遵循格式:“YYYYMMDD”,你可以使用substr:summermonths &lt;- Df[substr(DateVariable, 6, 6) %in% 6:9, ]
  • 重新编辑,Mean_Temp$MESS_DATUM_BEGINN 是您的日期变量(转换为日期)上month 函数的结果吗?
  • 是的,Mean_Temp$MESS_DATUM_BEGINN 是函数的结果。(所有月份)我第一次尝试了你的函数,但由于month 中缺少 s,它没有工作,因此我使用了as.Date,没有使用month,它给了我一个1961-01-01格式的结果。今天我用months再次尝试了你的功能。结果是带有月份名称的字符类。现在我想知道如何将它们作为 char 进行子集化。或编号。价值

标签: r dataframe time-series subset as.date


【解决方案1】:

您可以将日期变量转换为日期(格式)并取月份:

allmonths <- month(as.Date(Df$DateVariable, format="%Y%m%d"))

请注意,您的列最初已导入为factor,您需要先将其转换为character

allmonths <- month(as.Date(as.character(Df$DateVariable), format="%Y%m%d"))

然后你可以检查是否是夏季月份:

summersmonth <- Df[allmonths %in% 6:9, ]

示例:

as.Date("20190702", format="%Y%m%d")
[1] "2019-07-02"

month(as.Date("20190702", format="%Y%m%d"))
[1] 7

【讨论】:

  • 嗨,我尝试了您的代码的第一行(转换为 as.Date),我收到了这条消息:“as.Date.numeric 中的错误(Mean_Temp$MESS_DATUM_BEGINN, format =”%Y% m%d") : 'origin' 必须提供 ".
  • @m_rub 请给出dput(head(Mean_Temp$MESS_DATUM_BEGINN)) 的结果:没有更多细节,很难知道是什么导致了错误。您很可能正在处理factors 而不是characters,然后使用allmonths &lt;- month(as.Date(as.character(Df$DateVariable), format="%Y%m%d")) 传递同一行应该可以解决问题
【解决方案2】:

我们可以使用anytime中的anydate转换为Date类,然后提取month

library(anytime)
month(anydate(as.character(Df$DateVariable)))

【讨论】:

  • @m_rub 可能是你有数值。转换为character 并尝试。我更新了帖子
  • 没错,正如我在这里发现的那样:stackoverflow.com/questions/24315463/… 谢谢!
  • 您好,感谢您的帮助,我愿意为您服务,但我最初的问题更多是关于如何过滤/子集某个月,而不是如何更改格式。我想更改格式可能是解决问题的第一步,但问题本身仍未解决。
猜你喜欢
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多