我的桌子上有人员的个人资料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
我想创建两个新变量:
显示“首次访问后的天数”。所以基本上,现在的日期减去访问的第一个日期(最早的日期)。如果数据是用于配置文件的第一次访问,则天数应该为0.例如,配置文件ID 1108的最早访问是2014-06-27,因此新变量将为0。第二次访问是在2015-01-19。因此,新变量将是2015-01-19和首次访问之间的天数。同样,对于第三次访问,新变量将具有第三次访问和第一次访问之间的天数
访问次数,即第一次访问还是第二次访问。最早的日期将是第一次访问,下一个日期是第二次访问,等等。
结果表应如下所示:
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
答案 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});
}
}