我希望有人可以帮助我解决以下问题: 我正在使用r中的两个数据表:一个包含来自四年来用户的体重测量值,另一个包含来自同一时间段内这些相同用户的身体活动测量值。我一直在寻找体重测量数据的长途休息时间,这些是我感兴趣的事件。现在,我想在体重数据中提取事件时间范围内的身体活动数据。 在过去的四年中,有些用户可能会发生几次举重事故,因此仅userID不足以提取数据。在体重数据集中,我创建了一个名为events_stop的变量,该变量是特定称重中断事件的标识符。该变量在体育锻炼数据表中尚不存在。我正在努力将此标识符添加到体育锻炼数据集中。
到目前为止,我的代码如下: 我首先根据体重数据创建了一个数据表,该数据表包含user_ID和events_stop以及-20,-4和+6周时间点的日期,后来我希望将它们添加到体育锻炼数据表的步骤中。 all3'
minus20andminus4 <- weight.all6[, lapply(.SD, min, na.rm=T),
by=.(user_ID, events_stop), .SDcols = c("minus20", "minus4", "plus6")]
为了能够将minus20andminus4中的日期数据与体育活动数据表进行匹配,我需要添加events_stop变量。为此,我想匹配user_ID相同且日期在停止事件期间内的行
steps.all3[, events_stop := ifelse(steps.all3$user_ID == minus20andminus4$user_ID
& steps.all3$date_local >= minus20andminus4$minus20
& steps.all3$date_local <= minus20andminus4$plus6,
minus20andminus4$events_stop, NA)]
这时我收到错误消息:
Error in Ops.factor(steps.all3$user_ID, minus20andminus4$user_ID) :
level sets of factors are different
In addition: Warning message:
In is.na(e1) | is.na(e2) :
longer object length is not a multiple of shorter object length
体重数据如下:
user_ID date_local weight_kg events_stop minus20 minus4 plus 6
134 2016-01-07 99.2 160 2016-01-07 2016-04-28 2016-07-07
134 2016-02-08 99.6 160 2016-01-07 2016-04-28 2016-07-07
134 2016-02-10 99.5 160 2016-01-07 2016-04-28 2016-07-07
134 2016-03-13 99.1 160 2016-01-07 2016-04-28 2016-07-07
222 2014-04-20 78.2 181 2014-04-20 2014-08-03 2014-11-20
222 2014-05-02 78.3 181 2014-04-20 2014-08-03 2014-11-20
222 2014-05-07 78.9 181 2014-04-20 2014-08-03 2014-11-20
222 2016-08-15 82.1 195 2016-08-13 2016-12-03 2017-02-11
222 2016-08-22 82.6 195 2016-08-13 2016-12-03 2017-02-11
因此,每个重量测量有一行。
步骤数据的结构相同:
user_ID date_local steps
134 2016-01-09 10231
134 2016-02-10 8972
222 2014-04-28 10332
222 2014-05-01 7782
222 2016-09-04 8432
有人可以帮我吗?提前非常感谢!
答案 0 :(得分:0)
date_local
中的steps.all3
中的一个是否有可能落在超过定期的时间内?如果真是这样,那么进行不平等联接可能是值得的。以下内容能捕获您的所需内容吗?
minus20andminus4[steps.all3,
.(i.user_ID, i.date_local, i.steps, x.events_stop, x.minus20, x.minus4, x.plus6),
on = .(user_ID = user_ID, minus20 <= date_local, plus6 >= date_local),
allow.cartesian = TRUE]
i.user_ID i.date_local i.steps x.events_stop x.minus20 x.minus4 x.plus6
1: 134 2016-01-09 10231 160 2016-01-07 2016-04-28 2016-07-07
2: 134 2016-02-10 8972 160 2016-01-07 2016-04-28 2016-07-07
3: 222 2014-04-28 10332 181 2014-04-20 2014-08-03 2014-11-20
4: 222 2014-05-01 7782 181 2014-04-20 2014-08-03 2014-11-20
5: 222 2016-09-04 8432 195 2016-08-13 2016-12-03 2017-02-11