循环遍历R中的数据框并测量两个值之间的时差

时间:2017-07-03 12:41:01

标签: r loops time conditional

摘要:我正在分析发生的刺激(A& B)与用户可能的反应之间的时差。

数据集具有以下结构:

    structure(list(User = c("005b98f3-5b1b-4d10-bdea-a55d012b2844",
"005b98f3-5b1b-4d10-bdea-a55d012b2844", "005b98f3-5b1b-4d10-bdea-a55d012b2844", 
"005b98f3-5b1b-4d10-bdea-a55d012b2844", "005b98f3-5b1b-4d10-bdea-a55d012b2844", 
"005b98f3-5b1b-4d10-bdea-a55d012b2844", "005b98f3-5b1b-4d10-bdea-a55d012b2844", 
"005b98f3-5b1b-4d10-bdea-a55d012b2844", "005b98f3-5b1b-4d10-bdea-a55d012b2844", 
"005b98f3-5b1b-4d10-bdea-a55d012b2844", "005b98f3-5b1b-4d10-bdea-a55d012b2844", 
"005b98f3-5b1b-4d10-bdea-a55d012b2844", "005b98f3-5b1b-4d10-bdea-a55d012b2844", 
"005b98f3-5b1b-4d10-bdea-a55d012b2844", "005b98f3-5b1b-4d10-bdea-a55d012b2844", 
"005b98f3-5b1b-4d10-bdea-a55d012b2844", "005b98f3-5b1b-4d10-bdea-a55d012b2844", 
"005b98f3-5b1b-4d10-bdea-a55d012b2844", "005b98f3-5b1b-4d10-bdea-a55d012b2844", 
"005b98f3-5b1b-4d10-bdea-a55d012b2844"), Date = c("25.11.2015 13:59", 
"03.12.2015 09:32", "07.12.2015 08:18", "08.12.2015 19:40", "08.12.2015 19:40", 
"22.12.2015 08:52", "22.12.2015 08:50", "22.12.2015 15:42", "22.12.2015 20:46", 
"05.01.2016 11:33", "05.01.2016 11:35", "05.01.2016 13:22", "05.01.2016 13:21", 
"05.01.2016 13:22", "06.01.2016 09:18", "14.02.2016 22:47", "20.02.2016 21:27", 
"01.04.2016 13:52", "24.07.2016 07:03", "04.08.2016 08:25"), 
    Hour = c(1645L, 1833L, 1928L, 1963L, 1963L, 2288L, 2288L, 
    2295L, 2300L, 2627L, 2627L, 2629L, 2629L, 2629L, 2649L, 3598L, 
    3741L, 4717L, 7447L, 7712L), StimuliA = c(1L, 0L, 1L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
    0L), StimuliB = c(0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 
    1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), Responses = c(0L, 
    1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 
    1L, 1L, 1L, 0L)), .Names = c("User", "Date", "Hour", "StimuliA", 
"StimuliB", "Responses"), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))

有关数据的其他信息:数据表中的每一行都是一个事件日志,其中用户感知某个刺激或执行某个操作(响应)。小时:"小时"自项目开始以来,事件发生时。

目标:总体目标是衡量刺激和反应之间的时间。 (如果有的话)我想为每个用户创建一个遍历数据集的循环,如果一个Stimuli的值为1,它会检查以后是否有用户的响应并创建一个带有值的向量A和A的一个。

问题: 我是否会使用for循环执行此操作,该循环遍历每个用户并检查感知的刺激,如果有值1,则检查相同的用户ID是否在最近的响应中具有值1,然后比较2个日期?

子问题//我正在讨论的事情

  1. 我如何实际遍历每一行并检查条件语句,如果TRUE执行命令? (如果别的?)。
  2. 我怎么会在命令中保存此行中其他单元格的值?
  3. 然后告诉R寻找相同用户ID的最近响应(按时间顺序排列)并计算这两个值之间的时差?
  4. 最终创建具有这些计算值的矢量
  5. 期望的结果:

    Stimuli A c=(11253, 2122, 56969), Stimuli B c=(19512,107)
    

    我自己编写的代码到目前为止并不是很有用。我正在试验for循环和if语句,还试验ifelse函数。

    我是R的新手,但在数据广播上做了多个课程,但我仍在努力将其应用到我自己的硕士论文中。感谢您的帮助。

    其他信息:

    R version 3.4.0 (2017-04-21)
    Platform: x86_64-w64-mingw32/x64 (64-bit)
    Running under: Windows >= 8 x64 (build 9200)
    

2 个答案:

答案 0 :(得分:0)

SQL语法应该能够为您提供答案,并且是查询这些表格数据的传统方法。 Data.Table包使这种语法可访问。

#import necessary library
library(data.table)

#instantiate data table
dt<-data.table(dt)

#convert date field to Date type
dt$Date <- as.POSIXct(dt$Date, format="%d.%m.%Y %H:%M")
#create another date field so as not to lose during join
dt$rollDate<-dt$Date

#create table with stimuliA and set key for sorting/joining purposes
stima.dt <- dt[StimuliA==1,.(User,rollDate,Date,Hour,StimuliA)]
setkey(stima.dt,User,rollDate)

#Same for stimuliB
stimb.dt <- dt[StimuliB==1,.(User,rollDate,Date,Hour,StimuliB)]
setkey(stimb.dt,User,rollDate)

#same for responses table
resp.dt <- dt[Responses==1,.(User,rollDate,Date,Hour,Responses)]
setkey(resp.dt,User,rollDate)

#Join stimuli A table to closes responses
stim.a<-resp.dt[stima.dt,roll=-Inf]

#calculate Hour differences
stim.a[,difftime(Date,i.Date,units="min")]

#Join stimuli B table to closes responses
stim.b<-resp.dt[stimb.dt,roll=-Inf]

#calculate Hour differences
stim.b[,difftime(Date,i.Date,units="min")]

答案 1 :(得分:0)

以下是dplyr如何做到这一点。首先,您需要将Date列转换为POSIXct对象。然后,确保Date对象与arrange一起订购。然后使用mutate添加时差列。然后,对于Stimuli A或B为1且后面的响应等于1的行,您可以filter

df$Date <- as.POSIXct(strptime(df$Date,"%d.%m.%Y %H:%M"))
df %>%
  arrange(User,Date)%>%
  mutate(difftime= difftime(lead(Date),Date, units = "mins") ) %>%
  group_by(User)%>%
  filter((StimuliA==1 | StimuliB==1) & lead(Responses)==1)

                                  User                Date  Hour StimuliA StimuliB Responses   difftime
                                 <chr>              <dttm> <int>    <int>    <int>     <int>     <time>
1 005b98f3-5b1b-4d10-bdea-a55d012b2844 2015-11-25 13:59:00  1645        1        0         0 11253 mins
2 005b98f3-5b1b-4d10-bdea-a55d012b2844 2015-12-07 08:18:00  1928        1        0         0  2122 mins
3 005b98f3-5b1b-4d10-bdea-a55d012b2844 2015-12-08 19:40:00  1963        0        1         0 19510 mins
4 005b98f3-5b1b-4d10-bdea-a55d012b2844 2016-01-05 11:35:00  2627        0        1         0   106 mins
5 005b98f3-5b1b-4d10-bdea-a55d012b2844 2016-01-06 09:18:00  2649        1        0         0 56969 mins