大家早上好,这是我第一次发布堆栈溢出 . 感谢您的任何帮助!
我有2个数据帧用于分析库存数据 . 一个数据框有其他信息的日期,我们可以称之为df:
df1 <- tibble(Key = c('a','b','c'), i =11:13, date= ymd(20110101:20110103))
第二个数据框还有日期和其他重要信息 .
df2 <-tibble(Answer = c('a','d','e','b','f','c'), j =14:19, date= ymd(20150304:20150309))
这是我想要做的:对于df1中的每一行,我需要:
-
在df2中查找日期,其中,当df2 $ answer与df1 $ key相同时,它与df1中该行的日期最接近 .
-
然后在df2中提取该行中另一列的信息,并将其放在df1中的新行中 .
我试过的代码:
df1 %>%
group_by(Key, i) %>%
mutate(
`New Column` = df2$j[
which.min(subset(df2$date, df2$Answer== Key) - date)])
结果如下:
Key i date `New Column`
1 a 11 2011-01-01 14
2 b 12 2011-01-02 14
3 c 13 2011-01-03 14
这对于第一行 a
是正确的 . 在 df2
中,最接近的日期是 2015-03-04
, j
的值实际上是 14
.
但是,对于第二行 Key=b
,我希望 df2
到子集只查看 df2$Answer = b
行的日期 . 因此,日期应为 2015-03-07
,其中 j =17
.
谢谢您的帮助!
杰西
1 回答
这应该工作:
我们首先使用
left_join
加入两个数据框 . 是的,我知道每个Key
可能有多个日期,请耐心等待 .接下来,我们计算(使用
mutate
)两个日期date.x
和date.y
之间差异的绝对值(abs
) .现在我们有了这个,我们将使用
group_by
按Key
对数据进行分组 . 这将确保在后续计算中将单独处理每个不同的Key
.由于我们已经计算了
date_diff
,我们现在可以为每个Key
重新排序(arrange
)数据,最小date_diff
为每个Key
的第一个 .最后,我们只对每个
Key
的第一个,最小的date_diff
感兴趣,所以我们可以使用slice(1)
丢弃其余部分 .这个管道给了我们以下内容: