【问题标题】:R does not recognise dates in loopR 不能识别循环中的日期
【发布时间】:2019-02-15 12:58:05
【问题描述】:

我希望循环一个日期向量,使用这些日期作为子集标准并进行计算。为简单起见,我们假设这些计算是行数。

问题是 R 将日期向量视为 5 位数字。尽管已使用as.Date 将其强制为日期,因此,循环创建了一个长度为 17,896 的列表。在我的循环列表中只有 12 个日期。

我非常期待任何建议。谢谢。

# first date of each month in 2018
dates_2018 = seq(as.Date("2018-1-1"), as.Date("2018-12-31"), "days")
loop_date = as.Date(as.vector(tapply(dates_2018, substr(dates_2018, 1, 7), max), mode="any"), origin = "1970-01-01")

# dummy df
df = data.frame(id = 1:length(dates_2018)
                ,dates_2018)

# count number of days satisfy criteria
y = list()
for (i in loop_date)
{
  y[[i]] = nrow(df[df$dates_2018 >= i, ])
}; y

【问题讨论】:

    标签: r loops


    【解决方案1】:

    您可以使用y[[i]] = nrow(df[df$dates_2018 >= as.Date(i,origin = "1970-01-01"), ]) 并通过y[[17562]] 获得结果,但您会在包含 17,896 个元素的列表中找到您的结果。这里更合适

    for (i in seq_along(loop_date))
    {
      y[[i]] = nrow(df[df$dates_2018 >= loop_date[i], ])
    }
    

    【讨论】:

    • 有效!谢谢你。我猜 seq_along 的目的是为 loop_date 的每个元素创建一个 id,循环中的 i 引用而不是元素本身?
    • @T.Fung 是的,这是正确的,比使用 1:length(x) 安全得多,请参阅 here
    猜你喜欢
    • 2019-03-30
    • 2020-12-16
    • 2020-07-06
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多