【发布时间】:2018-08-31 14:50:07
【问题描述】:
我有一个由以下代码生成的数据框
l_ids = c(1, 1, 1, 2, 2, 2, 2)
l_months = c(5, 5, 5, 88, 88, 88, 88)
l_calWeek = c(201708, 201709, 201710, 201741, 201742, 201743, 201744)
value = c(5, 6, 3, 99, 100, 1001, 1002)
dat <- setNames(data.frame(cbind(l_ids, l_months, l_calWeek, value)),
c("ids", "months", "calWeek", "value"))
看起来像这样:
+----+-------+----------+-------+
| Id | Month | Cal Week | Value |
+----+-------+----------+-------+
| 1 | 5 | 201708 | 4.5 |
| 1 | 5 | 201709 | 5 |
| 1 | 5 | 201710 | 6 |
| 2 | 88 | 201741 | 75 |
| 2 | 88 | 201742 | 89 |
| 2 | 88 | 201743 | 90 |
| 2 | 88 | 201744 | 51 |
+----+-------+----------+-------+
我想从每个 id-month 组中随机抽取一个日历周(这些月份不是日历月)。然后我想保留样本月份之前的所有 id-month 组合。
一个示例输出可能是:假设组 id=2 和月=88 的采样输出返回 cal week 201743 和组 id=1 和月=5 的 201709,那么最终输出应该是
+----+-------+----------+-------+
| Id | Month | Cal Week | Value |
+----+-------+----------+-------+
| 1 | 5 | 201708 | 4.5 |
| 1 | 5 | 201709 | 5 |
| 2 | 88 | 201741 | 75 |
| 2 | 88 | 201742 | 89 |
2 | 88 | 201743 | 90 |
+----+-------+----------+-------+
我尝试使用 dplyr 的 sample_n 函数(它将按 id-month 组为我提供随机日历周,但是我不知道如何获取该日期之前的所有日历周。你能帮我吗?这个。如果可能的话,我想和 dplyr 合作。
如果您需要更多信息,请告诉我。
非常感谢
【问题讨论】:
-
好的,忘记我刚刚删除的评论。我认为您的问题看起来很有趣,但我们非常感谢一个示例数据框...(您应该知道 :)
-
作为一个想法。通过抽样,您将获得抽样日历周的向量。现在,您可以使用此向量在原始数据框的 cal week 列中定义最大值,并过滤掉更高(或更低)的最大值。
-
嗨 Tjebo,谢谢我添加了一些代码。你能解释一下如何在计算周中找到最大值吗?谢谢。此外,数据框有点大(大约 12 000 000 行)。我实际上在创建随机样本(即使用 sample_n)时遇到了一些性能问题。
-
明确地说,您只想从一个特定的 Cal Week 中采样,并保留此 Cal Week 之前的行中的 id-month 组合?
-
嗨 Colin,我想在 id-month 组中采样一个日历周,然后将所有日历周保持在采样的下面。