【发布时间】: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 个月的移动