Использование двух кадров данных и их столбцов в функциях mutate или других функциях dplyr - PullRequest
1 голос
/ 04 июля 2019

Я пытаюсь определить разницу между двумя датами, но из отдельных фреймов данных в 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 

Я попытался использовать on d1 в аргументе mutate, а затем напрямую вызвать столбец для date из d2

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

Я также получаю сообщение об ошибке:

Ошибка: столбец datediff должен иметь длину 201 (размер группы) или один, а не 1000 Кроме того: Предупреждение: In Ops.factor(Call_date, df2 $ date): '-' не имеет значения для факторов

Редактировать:

Я также хотел бы знать, как найти разницу в дате и времени в минутах

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Я думаю, что проблема заключается в 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 
0 голосов
/ 04 июля 2019

Если у вас есть значения даты и времени, вам может потребоваться изменить класс date на POSIXct на основе имеющегося у вас format (читай ?strptime), а также order на id, чтобы мы моглиправильно расположите все данные, а затем используйте difftime с units, указанным как "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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...