首页 文章

R dplyr rowwise mutate

提问于
浏览
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-04j 的值实际上是 14 .

但是,对于第二行 Key=b ,我希望 df2 到子集只查看 df2$Answer = b 行的日期 . 因此,日期应为 2015-03-07 ,其中 j =17 .

谢谢您的帮助!

杰西

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 )两个日期 date.xdate.y 之间差异的绝对值( abs ) .

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

    由于我们已经计算了 date_diff ,我们现在可以为每个 Key 重新排序( arrange )数据,最小 date_diff 为每个 Key 的第一个 .

    最后,我们只对每个 Key 的第一个,最小的 date_diff 感兴趣,所以我们可以使用 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
    

相关问题