【问题标题】:R: Function to ID duplicated dates and jitter months to get sequential months within a yearR:识别重复日期和抖动月份以获取一年内连续月份的功能
【发布时间】:2017-03-03 11:14:45
【问题描述】:

长期潜伏者,第一次发布海报,仍然是一个笨手笨脚的 R 初学者。
我想要一些关于 R 中抖动月份的帮助 – 抖动可能不是最好的描述?

我正在使用的完整数据集包含 10,000 行 x 30 列。该数据集包含 40 个站点,每个站点的开始日期从 1986 年到 2012 年,每月(在每个站点)收集到 2015 年 12 月的样本。有缺失的日期(样本),但这些没有在数据集中表示。因此,对于任何给定的站点,每年可能有也可能没有 12 个月(样本)。

下面是一个示例数据集,我想要的日期看起来像具有连续月份的 req.date 数据框

wq <- data.frame(site = c(rep("A", 5), rep("B", 5)), 
             date = as.Date(c("23/06/2012", "01/07/2012", "26/07/2012", 
              "05/09/2012", "23/10/2012", "01/04/2016", "08/05/2016", 
              "01/07/2016", "30/07/2016", "05/08/2016"), format = "%d/%m/%Y"), 
             year = c(rep("2012", 5), rep("2016", 5)),
             month = c(6, 7, 7, 9, 10, 4, 5, 7 , 7, 8))


req.date <- data.frame(req.date = 
                     as.Date(c("23/06/2012", "01/07/2012", "26/08/2012", 
                     "05/09/2012", "23/10/2012", "01/04/2016", "08/05/2016", 
                     "01/06/2016", "30/07/2016", "05/08/2016"), format = "%d/%m/%Y"))

我创建了月份和年份列,以便人们可以理解我的问题,而这对于我的最终数据集来说不是必需的。

我想知道的是如何“抖动” wq$date 的月份部分(按 +/- 一个月),其中月份重复。我只对调整月份感兴趣,我不太关心确切的日期。

我找到了这个 add.Month 函数 (Add a month to a Date),但希望能帮助我在重复日期上方和下方的行中调整 wq$date 占月份的功能

我已对按站点和年份分组的重复日期进行了 ID 化

wq$dup <- duplicated(wq[ ,c(1,3,4)])

但现在我不确定如何使用函数来完成最后一步。 我将使用我非常糟糕的 R 编码技能来尝试解决方案(我为我缺乏技能而道歉!)

#use wq$month to make it easier to make comparisons 
wq$new.date <- ifelse wq$dup ="TRUE", c <- wq$month - (nrow(wq$month) -2)
ifelse c = 1, wq$date <- month(wq$date) + 1,
# if the diff btw the duplicate date/month is 1 month more than the month value located 2 rows up, then the 
# duplicate month needs +1 month
ifelse c = 2, (nrow(wq$date) +1) <- month(wq$date) - 1
# if the diff btw the duplicate date/month is 2 months more than the month value located 2 rows up, then the 
# month above the duplicate month needs -1 month
else wq$date

任何帮助将不胜感激!

更新:

我需要识别重复的月份(我已经完成了),然后查看一年中的月份序列以确定是否需要调整重复的月份(通过 +/- 1 个月)以完成月份序列那个特定的年份。例如来自上述数据框并使用站点 A。月份重复是 01/07/2012 和 26/07/2013。站点 A 的月份顺序当前是 (6, 7, 7, 8, 9)。正确的月份顺序应该是 (6, 7, 8, 9, 10)。对于站点 B,月份重复是 01/07/2016 和 30/07/2016。站点 B 的月份顺序当前是 (4, 5, 7, 7, 8)。正确的月份顺序应该是 (4, 5, 6, 7, 8)。我需要一个函数来更正月份序列。

【问题讨论】:

  • 您想要一个关于日期 (YYYY-MM) 的复制函数,其容差为 1 个月。这是你想要的吗?
  • @并感谢您的回复。我有问题更新。希望这能澄清我在追逐什么..谢谢
  • 好的...但是您如何从站点 A 的月份序列(当前为 (6, 7, 7, 8, 9))中获取。正确的月份顺序,应该是 (6, 7, 8, 9, 10)....为什么是 10?这不仅是一个月的班次,您还希望将副本转移 3 个月。以及为什么它在序列的开头没有移动(5、6、7、8、9),这意味着 2 个月的移动

标签: r function date


【解决方案1】:

此代码搜索包含相同年份和月份(重复)的所有日期。之后检查重复调查前后一个月是否没有样本。如果有样本缺失,则重复的日期值将替换为缺失的第一个月份。

add.months= function(date,n) seq(date, by = paste (n, "months"), length = 2)[2]

months <- substr(wq[,2], 1,7)
pos <- which(duplicated(months))

for(z in pos){
  neighbour <- 
    format(
      c(
        add.months(wq[z,2], -1),
        add.months(wq[z,2], 1)
      ),
      format="%Y-%m-%d")

  if(sum(!substr(neighbour,1,7) %in% months) >= 1){
    wq[z,2] <- neighbour[which(!substr(neighbour,1,7) %in% months)[1]]
  }
}

wq <- wq[with(wq, order(site, date)),]

【讨论】:

  • 球对不起...我上次更新中的主要错字应该是这样的:月份重复是 01/07/2012 和 26/07/2013。站点 A 的月份顺序当前是 (6, 7, 7, 9, 10)。正确的月份顺序应该是 (6, 7, 8, 9, 10)。对于站点 B,月份重复是 01/07/2016 和 30/07/2016。站点 B 的月份顺序当前是 (4, 5, 7, 7, 8)。正确的月份顺序应该是 (4, 5, 6, 7, 8)。
  • 您的第二个答案解决了站点 A 的日期/月份情况,但站点 B 的月份序列最终为 (4, 5, 7, 6, 8)....非常接近!感谢您的帮助(和耐心!),
  • 顺便说一下我们这边不注意。如果有两个月但在不同方面,此脚本将视为重复。您的数据中有这种情况吗?
  • 完美!要获得完整的答案,您在第一个答案中的 add.months 函数也需要运行上述代码?这是正确的吗?只是为了其他想要使用您的答案的人?谢谢!
猜你喜欢
  • 2021-12-16
  • 2016-02-10
  • 1970-01-01
  • 2015-06-20
  • 2017-01-27
  • 1970-01-01
  • 2021-11-04
  • 2021-05-11
  • 2019-06-30
相关资源
最近更新 更多