将标识符变量从一个数据集提取到r

时间:2018-08-28 18:49:14

标签: r data.table

我希望有人可以帮助我解决以下问题: 我正在使用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

有人可以帮我吗?提前非常感谢!

1 个答案:

答案 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