R - Эффективный подсчет количества переключателей в двоичной переменной для каждой группы - PullRequest
0 голосов
/ 30 июня 2018

Чтобы дать некоторый контекст, у меня есть блок данных с отслеживанием информации из психологического эксперимента, и я хочу подсчитать переключение между двумя интересующими областями (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))
}

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Поскольку вы уже используете tidyverse, вы можете использовать lag, доступный как часть dplyr. Это проверяет, совпадает ли значение AOI1 с предыдущим значением, и если нет, устанавливает флаг в 1. Для первой записи каждого участника значение автоматически устанавливается равным NA. Обратите внимание, что group_by является обязательным, иначе флаг не будет сброшен при каждом обнаружении нового участника. Также предполагается, что данные отсортированы по участнику и времени; если нет, труба arrange(Participant, Time) до 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))
0 голосов
/ 30 июня 2018

Один из вариантов - использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...