另一个coloumn中特定值的两个值之间的差异

时间:2018-02-19 09:44:31

标签: r date dataframe

我的桌子上有人员的个人资料ID和日期:他们上次访问他们的在线个人资料。

   Profile      Date      
     1108      2015-01-19        
     1108      2014-06-27     
     1108      2016-09-13
     1284      2015-03-04       
     1284      2015-06-21
     1641      2016-07-14

我想创建两个新变量:

  1. 显示“首次访问后的天数”。所以基本上,现在的日期减去访问的第一个日期(最早的日期)。如果数据是用于配置文件的第一次访问,则天数应该为0.例如,配置文件ID 1108的最早访问是2014-06-27,因此新变量将为0。第二次访问是在2015-01-19。因此,新变量将是2015-01-19和首次访问之间的天数。同样,对于第三次访问,新变量将具有第三次访问和第一次访问之间的天数

  2. 访问次数,即第一次访问还是第二次访问。最早的日期将是第一次访问,下一个日期是第二次访问,等等。

  3. 结果表应如下所示:

       Profile      Date             Days           Vist_Count
         1108      2015-01-19        206                2
         1108      2014-06-27         0                 1
         1108      2016-09-13        809                3
         1284      2015-03-04         0                 1
         1284      2015-06-21        109                2
         1641      2016-07-14         0                 1
    

    我希望我对这个问题很清楚。非常感谢! Wasiq

1 个答案:

答案 0 :(得分:1)

我们按照'个人资料'进行分组,得到'日期' rank的日期'创造' Days'专栏,而' Visit_Count'是通过获取'日期'

library(data.table) setDT(df1)[, `:=`(Days = Date - min(Date), Visit_Count = rank(Date)), Profile] df1 # Profile Date Days Visit_Count #1: 1108 2015-01-19 206 days 2 #2: 1108 2014-06-27 0 days 1 #3: 1108 2016-09-13 809 days 3 #4: 1284 2015-03-04 0 days 1 #5: 1284 2015-06-21 109 days 2 #6: 1641 2016-07-14 0 days 1 来创建的
tidyverse

或使用library(dplyr) df1 %>% group_by(Profile) %>% mutate(Days = Date - min(Date), Visit_Count = rank(Date))

df1 <- structure(list(Profile = c(1108L, 1108L, 1108L, 1284L, 1284L, 
1641L), Date = structure(c(16454, 16248, 17057, 16498, 16607, 
16996), class = "Date")), .Names = c("Profile", "Date"), row.names = c(NA, 
-6L), class = "data.frame")

数据

service.getAllDeviceRecentLatLng = async (req,res) =>{
    try{
        let condition = [
                            {
                                $match:{clientId: utility.removeQuotationMarks(req.query.clientId)}
                            },
                           {
                             $project:
                              {
                                 deviceId:1,
                                 recent: { $arrayElemAt: [ "$history", -1 ] }
                              }
                           }
                        ];
    const deviceTrackingHistory = await DeviceTrackingHistory.getAggregation(condition);
        logger.info('sending all DeviceTrackingHistory...');
        res.send({success:true, code:200, msg:"sending all DeviceTrackingRecentLatLng", data:deviceTrackingHistory});
    }catch(err){
        logger.error('Error in getting DeviceTrackingHistory- ' + err);
        res.send({success:false, code:500, msg:"sending all DeviceTrackingRecentLatLng Faild", err:err});
    }
}