【问题标题】:Increase number count sequentially from 1 - 365 (366) for every year (leap year)每年(闰年)从 1 到 365 (366) 依次增加数量
【发布时间】:2015-10-09 18:30:54
【问题描述】:

我有每日天气数据,其中包含月份、月份、年份和数据的列。但我需要为一年中的这一天添加另一列。 例如 1 - 365(或闰年为 366)。

我根本不是一个程序员,我对 seq() 很熟悉 例如seq(1, 365) 但以上将在 365 处终止。我需要在考虑年份的同时依次增加数字,以便序列每年重新开始(并考虑闰年)。在此示例中,所有天气数据都从 1 月 1 日开始。 任何想法/建议/指针都非常感谢。

编辑:示例数据

example.data <- structure(list(V1 = 1:6, V2 = c(1L, 1L, 1L, 1L, 1L, 1L), 
    V3 = c(1950L, 1950L, 1950L, 1950L, 1950L, 1950L), 
    V4 = c(NA, NA, NA, NA, NA, NA), 
    V5 = c(0, 0, 0, 0, 0, 0)),
    .Names = c("V1", "V2", "V3", "V4", "V5"), row.names = c(NA, 6L), class =                "data.frame")`

【问题讨论】:

  • 要以对回答问题的人有用的格式获取数据,请尝试运行dput(head(dat)),其中dat 是数据框的名称。

标签: r


【解决方案1】:

假设您的数据集名为df,您可以构造一个日期字段:

df$date <- as.Date(paste(df$Y, df$m, df$d, sep="-"), "%Y-%m-%d")

然后使用从该日期对象中获取%j 属性:

df$day_of_year <- as.numeric(strftime(df$date, "%j"))

【讨论】:

    【解决方案2】:

    假设您的“年份”列名为“V3”,请尝试此代码:

    编辑:更严重的是,粘贴您的数据图片是个坏主意,see here 了解如何包含您的数据以便人们更容易地提供帮助。包括dput(head(data)) 几乎总是最好的。

    对于您的问题,请读入您的数据:

    z <- read.csv("test.data.txt", sep="\t", header = FALSE)
    

    然后每年使用 dplyr 到seq_along()

    library(dplyr)
    mydat <- z %>% group_by(V3) %>%
                   mutate(day = seq_along(V3))
    

    我们可以验证我们得到了一些 366:

    sum(mydat$day == 366)
    sum(mydat$day == 365)
    

    【讨论】:

    • 终于有人发图回答图数据了哈哈哈一直想做+1
    • 谢谢,我将按照对未来问题的建议使用 dput。代码效果很好!
    【解决方案3】:

    R 有一个Date 类,这是很好的第一步;您可以通过将列粘贴到“Y-M-D”格式然后调用as.Date 来获得它。但是还有一个更好的选择,那就是POSIXlt 类,它在yday 字段中包含您想要的信息,以及许多其他潜在的有用信息。那么我将 Date 转换为 POSIXlt 格式,并得到一年中的哪一天;因为这从零开始,所以我加 1。

    dat <- data.frame(d=1:6,
                      m=rep(c(1,2,12), 2),
                      y=rep(c(1950, 1951), each=3))
    dat$Date <- as.Date(with(dat, paste(y, m, d, sep="-")))
    dat$doy <- as.POSIXlt(dat$Date)$yday + 1
    dat
    ##   d  m    y       Date doy
    ## 1 1  1 1950 1950-01-01   1
    ## 2 2  2 1950 1950-02-02  33
    ## 3 3 12 1950 1950-12-03 337
    ## 4 4  1 1951 1951-01-04   4
    ## 5 5  2 1951 1951-02-05  36
    ## 6 6 12 1951 1951-12-06 340
    

    这样做的好处是,即使您的行顺序发生更改或缺少特定日期,它也能正常工作。让您的分析依赖于数据的顺序几乎从来都不是一个好主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多