在新数据帧 R 中扩展时间序列

如何解决在新数据帧 R 中扩展时间序列

我是 R 新手,我收集了具有以下结构的眼动追踪数据:

Participant Trial Condition Fixation.Start  Fixation.End Fixated.Area
P01         T01   Early     4               206          Outside
P01         T01   Early     258             476          Competitor
P01         T01   Early     496             882          Target
P01         T02   Late      4               794          Outside
P01         T02   Late      838             1026         Target
P01         T02   Late      1046            1328         Target
P02         T01   Early     4               168          Outside
P02         T01   Early     232             452          Competitor
P02         T01   Early     494             738          Target
P02         T02   Late      4               176          Outside
P02         T02   Late      238             466          Target
P02         T02   Late      524             632          Competitor

其中,屏幕上显示的不同区域的固定时间以毫秒为单位进行测量,从开始(Fixation Start)到结束(Fixation End)。每一行都是一个注视点。

我想做的是在新的数据帧中将数据重塑为 50 毫秒的时间段,以便每个时间段(行)反映当时正在注视的区域。换句话说,我希望新的数据框看起来像这样:

Participant Trial   Condition   Time.Bin    Fixated.Area
P01         T01     Early       50          Outside
P01         T01     Early       100         Outside
P01         T01     Early       150         Outside
P01         T01     Early       200         Outside
P01         T01     Early       250         Competitor
P01         T01     Early       300         Competitor
P01         T01     Early       350         Competitor
P01         T01     Early       400         Competitor
P01         T01     Early       450         Competitor
P01         T01     Early       500         Target
P01         T01     Early       550         Target
P01         T01     Early       600         Target
P01         T01     Early       650         Target  

我认为这在 R 中应该很容易做到。有什么想法吗?

解决方法

这是一种将每个时间范围扩展到 by=50 个时间段的技术。

基础 R

Time.Bins <- Map(
  function(a,b) seq(a,b,by = 50),ceiling(dat$Fixation.Start / 50) * 50,dat$Fixation.End)

out <- cbind(
  dat[,c("Participant","Trial","Condition","Fixated.Area")
      ][ rep(seq_len(nrow(dat)),lengths(Time.Bins)),],Time.Bin = unlist(Time.Bins)
)
head(out,20)
#     Participant Trial Condition Fixated.Area Time.Bin
# 1           P01   T01     Early      Outside       50
# 1.1         P01   T01     Early      Outside      100
# 1.2         P01   T01     Early      Outside      150
# 1.3         P01   T01     Early      Outside      200
# 2           P01   T01     Early   Competitor      300
# 2.1         P01   T01     Early   Competitor      350
# 2.2         P01   T01     Early   Competitor      400
# 2.3         P01   T01     Early   Competitor      450
# 3           P01   T01     Early       Target      500
# 3.1         P01   T01     Early       Target      550
# 3.2         P01   T01     Early       Target      600
# 3.3         P01   T01     Early       Target      650
# 3.4         P01   T01     Early       Target      700
# 3.5         P01   T01     Early       Target      750
# 3.6         P01   T01     Early       Target      800
# 3.7         P01   T01     Early       Target      850
# 4           P01   T02      Late      Outside       50
# 4.1         P01   T02      Late      Outside      100
# 4.2         P01   T02      Late      Outside      150
# 4.3         P01   T02      Late      Outside      200

dplyr

library(dplyr)
out <- dat %>%
  rowwise() %>%
  summarize(
    Participant,Trial,Condition,Fixated.Area,Time.Bin = seq(ceiling(Fixation.Start / 50) * 50,Fixation.End,.groups = "drop"
  )
out
# # A tibble: 64 x 5
#    Participant Trial Condition Fixated.Area Time.Bin
#    <chr>       <chr> <chr>     <chr>           <dbl>
#  1 P01         T01   Early     Outside            50
#  2 P01         T01   Early     Outside           100
#  3 P01         T01   Early     Outside           150
#  4 P01         T01   Early     Outside           200
#  5 P01         T01   Early     Competitor        300
#  6 P01         T01   Early     Competitor        350
#  7 P01         T01   Early     Competitor        400
#  8 P01         T01   Early     Competitor        450
#  9 P01         T01   Early     Target            500
# 10 P01         T01   Early     Target            550
# # ... with 54 more rows

固定时间=250

您的预期输出在时间=250 时显示“竞争对手”,但数据不支持。如果您需要 250(有或没有区域),那么您可以通过这种方式进行插值。

expbins <- do.call(rbind,by(out,out[,"Condition")],FUN = function(z) {
     rng <- seq(min(z$Time.Bin),max(z$Time.Bin),by = 50)
     transform(z[rep(1,length(rng)),Fixated.Area = NULL,Time.Bin = rng)
   }))
out2 <- merge(expbins,out,by = c("Participant","Time.Bin"),all = TRUE)
head(out2,10)
#    Participant Trial Condition Time.Bin Fixated.Area
# 1          P01   T01     Early       50      Outside
# 2          P01   T01     Early      100      Outside
# 3          P01   T01     Early      150      Outside
# 4          P01   T01     Early      200      Outside
# 5          P01   T01     Early      250         <NA>
# 6          P01   T01     Early      300   Competitor
# 7          P01   T01     Early      350   Competitor
# 8          P01   T01     Early      400   Competitor
# 9          P01   T01     Early      450   Competitor
# 10         P01   T01     Early      500       Target

将 time=250 表示为 NA,这是一个未知状态(更好,imo)。

Dplyr,相同:

out %>%
  group_by(Participant,Condition) %>%
  summarize(
    Time.Bin = seq(min(Time.Bin),max(Time.Bin),.groups = "drop"
  ) %>%
  full_join(out,"Time.Bin"))
# # A tibble: 69 x 5
#    Participant Trial Condition Time.Bin Fixated.Area
#    <chr>       <chr> <chr>        <dbl> <chr>       
#  1 P01         T01   Early           50 Outside     
#  2 P01         T01   Early          100 Outside     
#  3 P01         T01   Early          150 Outside     
#  4 P01         T01   Early          200 Outside     
#  5 P01         T01   Early          250 <NA>        
#  6 P01         T01   Early          300 Competitor  
#  7 P01         T01   Early          350 Competitor  
#  8 P01         T01   Early          400 Competitor  
#  9 P01         T01   Early          450 Competitor  
# 10 P01         T01   Early          500 Target      
# # ... with 59 more rows

数据:

dat <- structure(list(Participant = c("P01","P01","P02","P02"),Trial = c("T01","T01","T02","T02"),Condition = c("Early","Early","Late","Late"),Fixation.Start = c(4L,258L,496L,4L,838L,1046L,232L,494L,238L,524L),Fixation.End = c(206L,476L,882L,794L,1026L,1328L,168L,452L,738L,176L,466L,632L),Fixated.Area = c("Outside","Competitor","Target","Outside","Competitor")),class = "data.frame",row.names = c(NA,-12L))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?