首页 > 解决方案 > R - 有效地计算每组二进制变量中的开关数量

问题描述

为了提供一些背景信息,我有一个来自心理学实验的眼动追踪数据的数据框,我想为每个参与者计算两个感兴趣区域 (AOI) 之间的切换。

这是问题的简化数据框(我们假设AOI2 == !AOI1我们不需要它):

library(tidyverse)

df <- tibble(Participant = rep(1:7, times = 1, each = 10),
             Time = rep(1:10, 7),
             AOI1 = rbinom(70, 1, .5))

AOI1我想要的是计算每个参与者在一段时间内的变化值的多少倍。我可以使用for像下面这样的循环来做到这一点,但我想知道是否有一种更简单、更 R 的方式来做到这一点?

df.switches <- tibble(Participant = 1:7,
                      Switches = NA)
for(p in 1:7){
  s <- 0
  for(i in 2:10){
    if(subset(df, Participant == p & Time == i, select = AOI1) !=
       subset(df, Participant == p & Time == i-1, select = AOI1)){
      s <- s + 1
    }
  }
  df.switches <- df.switches %>%
    mutate(Switches = ifelse(Participant == p, s, Switches))
}

标签: r

解决方案


一种选择是dplyr::lag将该值与当前行进行比较,以计算每个参与者的开关数量。

library(tidyverse)

df %>% group_by(Participant) %>%
  summarise(count = sum(AOI1 != lag(AOI1, default = -Inf)))

# # A tibble: 7 x 2
#   Participant count
#         <int> <int>
# 1           1     5
# 2           2     4
# 3           3     5
# 4           4     4
# 5           5     6
# 6           6     6
# 7           7     4

推荐阅读