1

大家早上好,这是我第一次在堆栈溢出上发帖。感谢您的任何帮助!

我有 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

谢谢您的帮助!

杰西

4

1 回答 1

2

这应该有效:

library(dplyr)
df1 %>% 
  left_join(df2, by = c("Key" = "Answer")) %>% 
  mutate(date_diff = abs(difftime(date.x, date.y, units = "secs"))) %>% 
  group_by(Key) %>% 
  arrange(date_diff) %>% 
  slice(1) %>% 
  ungroup()

我们首先将两个数据框与left_join. 是的,我知道每个日期可能有多个日期Key,请耐心等待。

接下来,我们计算(用)两个日期和之差mutate的绝对值( ) 。absdate.xdate.y

现在我们有了这个,我们将使用 对数据进行Key分组group_by。这将确保每个不同的Key将在后续计算中单独处理。

由于我们已经计算了,我们现在可以对每个 的数据date_diff重新排序( ) ,将最小的作为每个 的第一个。arrangeKeydate_diffKey

最后,我们只对第一个感兴趣,date_diff对于 each来说是最小的Key,所以我们可以使用 丢弃其余的slice(1)

该管道为我们提供了以下信息:

  Key       i date.x         j date.y     date_diff
  <chr> <int> <date>     <int> <date>     <time>   
1 a        11 2011-01-01    14 2015-03-04 131587200
2 b        12 2011-01-02    17 2015-03-07 131760000
3 c        13 2011-01-03    19 2015-03-09 131846400
于 2018-06-21T14:42:34.173 回答