【问题标题】:find out number of days between end of each month and date of maximum value in r找出每个月末和r中最大值日期之间的天数
【发布时间】:2018-07-31 12:15:24
【问题描述】:

我有一个数据框,其中第一列是日期,第一行是公司。 df是这样的:

date            A        B       C       D
1/2/1998        0.0     0.0     0.0     0.0
1/5/1998        0.2     3.2     9.4     3.8
1/6/1998        2.1     2.5     1.7     0.9
1/7/1998        2.0     0.0     1.7     0.1
1/8/1998        12.7    3.7     5.3     1.1
1/9/1998        1.2     0.0     3.1     2.3
1/12/1998       2.1     0.0     0.0     1.4

当我找出每个月的最大值时,我使用以下代码:

df1 <- aggregate(df[,-1],
                      by=list(Month=format(df$date,"%y-%m")),
                      FUN=max)

现在我想创建另一个数据框,我将在其中找到最大日期到该月月底之间的天数。例如,如果最大值出现在 4 月 20 日,则新变量将为 10。我想要的输出可能如下所示:

Month          A      B       C      D
1998-1        20     12       26    14
1998-2        10     14       4     3
1998-3        15     18       9     12
1998-4        12     20       27    12
1998-5        22     24       5     23

【问题讨论】:

  • 我不明白你的例子。如果输入是 2 月 20 日,为什么输出是 10?
  • 输入不是 2 月 20 日。它是最大返回值到来的日期。下个月可能会有所不同
  • 您说“例如,如果最大值出现在 2 月 20 日,那么新变量将是 10”。我不明白为什么在这种情况下新变量是 10。 2 月有 28 或 29 天,具体取决于年份,所以结果似乎应该是 8 或 9,而不是 10。这只是一个错误,还是我仍然误解?
  • 您的示例数据框很有帮助,但如果您为该输入显示所需的输出会更有帮助。
  • 我已经给出了示例输出。 @Gregor

标签: r date max


【解决方案1】:

示例数据:

set.seed(1234)
df <- data.frame(date = as.Date(c("2018-02-10", "2018-02-15", 
                                  "2018-02-20", "2018-03-01", "2018-03-03")), 
                 V1 = runif(5), V2 = runif(5))
df1 <- aggregate(df[, -1],
                 by=list(Month=format(df$date,"%y-%m")),
                 FUN=max)
df1
  Month        V1        V2
1 18-02 0.6222994 0.6403106
2 18-03 0.8609154 0.6660838

最大。每个月的日期:

df2 <- tapply(1:nrow(df), format(df$date,"%y-%m"), 
              function(x) df[x, 1][apply(df[x, -1, drop = FALSE], 2, which.max)])
df2 <- data.frame(Month = names(df2), do.call(rbind, df2))
df2[, -1] <- lapply(df2[, -1], as.Date, origin = "1970-01-01")
colnames(df2) <- colnames(df1)
df2
      Month         V1         V2
18-02 18-02 2018-02-15 2018-02-10
18-03 18-03 2018-03-03 2018-03-01

差异。到下个月的几天:

library(lubridate)
df3 <- df2
df3[, -1] <- lapply(df3[, -1], function(x) days_in_month(x) - day(x) + 1)
df3
      Month V1 V2
18-02 18-02 14 19
18-03 18-03 29 31

【讨论】:

  • 非常感谢。每个公司每个月都应该有一个最大日期。如果V1是A公司,V2是B公司,那么每个月他们应该有不同的最大日期。
  • 对不起,我不明白你的数据结构,你能举一个可重现的例子吗?
猜你喜欢
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2021-08-05
相关资源
最近更新 更多