R-有效计算每组二进制变量中的开关数

R-有效计算每组二进制变量中的开关数,r,R,为了提供一些上下文,我有一个心理学实验的眼动数据框架,我想计算每个参与者在两个感兴趣区域(AOI)之间的切换 这里是问题的简化数据帧(我们假设AOI2==!AOI1所以我们不需要它): 一个选项是使用dplyr::lag将该值与当前行进行比较,以便计算每个参与者的开关数 library(tidyverse) df %>% group_by(Participant) %>% summarise(count = sum(AOI1 != lag(AOI1, default = -In

为了提供一些上下文,我有一个心理学实验的眼动数据框架,我想计算每个参与者在两个感兴趣区域(AOI)之间的切换

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


一个选项是使用
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
库(tidyverse)
df%>%分组依据(参与者)%>%
总结(count=sum(AOI1!=lag(AOI1,默认值=-Inf)))
##A tibble:7 x 2
#参与者人数
#          
# 1           1     5
# 2           2     4
# 3           3     5
# 4           4     4
# 5           5     6
# 6           6     6
# 7           7     4

由于您已经在使用
tidyverse
,因此可以使用
lag
作为
dplyr
的一部分提供。这将检查AOI1的值是否与前一个值相同,如果不相同,则将标志设置为1。对于每个参与者的第一条记录,该值自动设置为
NA
。请注意,
group_by
是必需的,否则每次遇到新参与者时,该标志不会被“重置”。还假设数据按参与者和时间排序;如果没有,管道
分组人之前安排(参与者,时间)

df <- tibble(Participant = rep(1:7, times = 1, each = 10),
             Time = rep(1:10, 7),
             AOI1 = rbinom(70, 1, .5))
df2 <- df %>%
  group_by(Participant) %>%
  mutate(switch = ifelse(AOI1 != lag(AOI1), 1, 0)) %>%
  summarise(num_switches = sum(switch, na.rm = TRUE))
df%
突变(开关=ifelse(AOI1!=lag(AOI1),1,0))%>%
总结(num_switches=sum(switch,na.rm=TRUE))

太好了,
滞后
正是我需要的!很高兴了解
arrange
,现在不需要它,但它肯定会在某个时候派上用场。
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
df <- tibble(Participant = rep(1:7, times = 1, each = 10),
             Time = rep(1:10, 7),
             AOI1 = rbinom(70, 1, .5))
df2 <- df %>%
  group_by(Participant) %>%
  mutate(switch = ifelse(AOI1 != lag(AOI1), 1, 0)) %>%
  summarise(num_switches = sum(switch, na.rm = TRUE))