【问题标题】:Error using if clause with yearmon data将 if 子句与 yearmon 数据一起使用时出错
【发布时间】:2017-10-16 11:11:09
【问题描述】:
library(zoo)
library(lubridate)
yearmon <- as.yearmon(c("01-10", "02-15", "03-30"), "%m-%y")
for (i in yearmon) {
if (year(yearmon[i]) > 2020) {
year(yearmon[i]) <- year(yearmon[i]) - 100
}}

Error in if (year(yearmona[i]) > 2020) { : 
missing value where TRUE/FALSE needed

我们的想法是获取不正确年份 > 2020 的数据,并将它们恢复为 19XX 形式。

【问题讨论】:

  • 你的year函数来自哪里?
  • 我认为使用函数名(yearmon)作为变量名不是一个好主意。
  • @Spacedman yearlubridate::year

标签: r zoo


【解决方案1】:

在这里,我们可以使用ifelse,但分配部分也不起作用

as.yearmon(paste(format(yearmon, "%b"), 
     ifelse(year(yearmon) > 2020, year(yearmon)-100, year(yearmon))))
#[1] "Jan 2010" "Feb 2015" "Mar 1930"

【讨论】:

  • yearmon 对象是数字 year.fractional,因此您不需要 year 函数。简单地说:yearmon[yearmon&gt;2020] = yearmon[yearmon&gt;2020]-100 就可以了。
  • @Spacedman Ya,有办法,但我只是使用 OP 的代码来纠正它
  • 这段代码一团糟。这不是我第一次尝试整理这些数据集...感谢您的帮助。
  • ym0 &lt;- as.yearmon(x, "%m-%y"); ym &lt;- ym0 - 100*(ym0 &gt; 2020)
【解决方案2】:

Zoo 的 yearmon 对象是年份 + 小数年份,因此您从 2020 年以上的任何数据中减去 100:

> yearmon <- as.yearmon(c("01-10", "02-15", "03-30"), "%m-%y")
> yearmon
[1] "Jan 2010" "Feb 2015" "Mar 2030"
> yearmon[yearmon > 2020] = yearmon[yearmon > 2020] - 100
> yearmon
[1] "Jan 2010" "Feb 2015" "Mar 1930"

这不需要 lubridate 或任何格式转换等。

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多