【问题标题】:Using two dataframes and their columns in mutate or other dplyr functions在 mutate 或其他 dplyr 函数中使用两个数据帧及其列
【发布时间】:2019-07-04 07:53:27
【问题描述】:

我试图确定两个日期之间的差异,但是来自 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,然后直接从d2 调用date 的列

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

我也收到了错误:

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

编辑:

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

【问题讨论】:

  • 我认为你最好先通过 ID 做一个merge
  • 您的数据框大小是否相同(错误)?您还需要在减去之前将您的 date 转换为正确的日期格式(警告)。我认为你最好合并两个数据框然后减去
  • 是的,我将尝试转换日期格式
  • 问题更新了
  • 对不起,我使用了错误的时间差异值,我已经更新了它。我还说如果我有约会时间的情况,我会怎么做

标签: r dataframe dplyr


【解决方案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 

【讨论】:

  • 如果我有一个日期时间字段,那我将如何显示呢?就像我想找出分钟数的差异?
  • 您的代码也出现了与我之前显示的相同的错误
【解决方案2】:

如果您有日期时间值,您可能需要根据您拥有的formatdate 更改为POSIXct 类(阅读?strptime),也可以通过idorder 更改为id,以便我们正确排列所有数据,然后使用difftimeunits 指定为"mins" 分钟。

d1 <- transform(d1, date = as.POSIXct(date, format = "%m/%d/%y"))
d11 <- d1[order(d1$id), ]

d2 <- transform(d2, date = as.POSIXct(date, format = "%m/%d/%y"))
d22 <- d2[order(d2$id), ]

difftime(d11$date, d22$date, units = "mins")
#Time differences in mins
#[1]  2880  2880 -1440  1440  1440 21600

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    相关资源
    最近更新 更多