在mutate或其他dplyr函数中使用两个数据框及其列

时间:2019-07-04 07:53:27

标签: r dataframe dplyr

我正在尝试确定两个日期之间的差,但是要从R中的单独数据帧中确定。这是一个数据帧,可以说d1

id      date        value        
2222    11/1/12     22.65     
2222    11/2/12     23.11     
20100   10/30/12    35.21       
20100   11/2/12     38.97     
20103   10/30/12    57.98     
20103   10/31/12    60.83     

这是另一个可以说的d2

id      date        value
2222    10/30/12    21.01      
2222    10/31/12    22.04                 
20100   10/31/12    37.07      
20100   11/1/12     38.17           
20103   10/29/12    57.98      
20103   10/16/12    60.83 

我的预期输出是

   Datediff
    2 day
    2 day          
    -1 day
    1 day     
    1 day
    15 day 

我尝试在mutate参数中的d1上使用,然后直接从date调用d2的列

data_RN<-d1 %>% group_by(id) %>% mutate(datediff= d1$date-d2$date)

我也收到错误消息:

  

错误:列datediff的长度必须为201(组大小)或一个,而不是1000   另外:警告消息:   在Ops.factor(Call_date,df2 $ date)中:     ‘-’对因素没有意义

编辑:

我还想知道如何找到以分钟为单位的日期时间差异

2 个答案:

答案 0 :(得分:1)

我认为问题出在group_by(id)。删除此元素,您将获得所需的内容:

library(tidyverse)

df1<-tribble(~id     ,~ date   ,~     value ,       
         2222  ,  "11/1/12"   ,  22.65  ,   
         2222   , "11/2/12"  ,   23.11  ,   
         20100  , "10/30/12" ,   35.21    ,   
         20100 ,  "11/2/12"   ,  38.97  ,   
         20103 ,  "10/30/12"  ,  57.98  ,   
         20103 ,  "10/31/12" ,   60.83    )

df2<-tribble(~id   ,~   date     ,~   value,
         2222 ,   "10/30/12"  ,  21.01  ,    
         2222 ,   "10/31/12" ,   22.04 ,                
         20100  , "10/31/12"  ,  37.07  ,    
         20100,   "11/1/12"  ,   38.17 ,          
         20103 ,  "10/29/12"   , 57.98 ,     
         20103 ,  "10/16/12" ,   60.83    )

df1<-df1%>%mutate(date= as.Date(df1$date,format= "%m/%d/%y"))
df2<-df2%>%mutate(date= as.Date(df2$date,format= "%m/%d/%y"))

data_RN<-df1 %>%mutate(datediff= df1$date-df2$date)

Output:

# A tibble: 6 x 4
     id date       value      datediff
   <dbl> <date>     <date>     <drtn>  
1  2222 2012-11-01 2012-11-01  2 days 
2  2222 2012-11-02 2012-11-02  2 days 
3 20100 2012-10-30 2012-10-30 -1 days 
4 20100 2012-11-02 2012-11-02  1 days 
5 20103 2012-10-30 2012-10-30  1 days 
6 20103 2012-10-31 2012-10-31 15 days 

答案 1 :(得分:0)

如果您有日期时间值,则可能需要根据您拥有的date(读为POSIXct)将format更改为?strptime类,{{1} 1}} {} order},以便我们正确整理所有数据,然后将iddifftime指定为units使用几分钟。

"mins"