Сгруппируйте и создайте индекс столбца в R - PullRequest
1 голос
/ 24 апреля 2020

У меня есть набор данных пользователей, которые пытаются решить математические задачи. Им случайным образом дают подсказку (и) для решения проблемы (hint.flag). Я хочу узнать, как скоро пользователь получит «правильный» ответ (правильность) для каждой проблемы, увидев подсказку FIRST в проблеме. Для начала мне нужно было бы создать какой-то индекс, чтобы определить, на какую попытку пост-подсказки они идут.

data.input <- read_table2("user.id  problem.id  correctness hint.flag
540995  A   FALSE   1
540995  A   FALSE   0
540995  A   FALSE   1
540995  B   FALSE   1
540995  B   FALSE   1
540995  B   TRUE    0
540995  C   FALSE   1
540995  C   FALSE   1
540995  C   TRUE    0
540995  D   TRUE    0
565662  A   TRUE    0
565662  A   FALSE   1
565662  A   FALSE   0
565662  A   FALSE   1
565662  A   FALSE   1
565662  A   FALSE   0
565662  A   FALSE   0
565662  A   FALSE   0")

Столбец, который я пытаюсь вписать, это "post.hint.attempt" (см. Требуемый. Выход).

desired.output <- read_table2("user.id  problem.id  correctness hint.flag   post.hint.attempt

540995  A   FALSE   1   
540995  A   FALSE   0   first
540995  A   FALSE   1   second
540995  B   FALSE   1   
540995  B   FALSE   1   first
540995  B   TRUE    0   second
540995  C   FALSE   1   
540995  C   FALSE   1   first
540995  C   TRUE    0   second
540995  D   TRUE    0   
565662  A   TRUE    0   
565662  A   FALSE   1   
565662  A   FALSE   0   first
565662  A   FALSE   1   second
565662  A   FALSE   1   third
565662  A   FALSE   0   fourth
565662  A   FALSE   0   fifth
565662  A   FALSE   0   sixth 
")

Я понятия не имею, как даже начать находить это ... Я думаю, что row_id может быть полезен, но необходимость запаздывать номер попытки при появлении подсказки сбивает меня с толку. Любая помощь будет потрясающей !!!

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

На всякий случай, вот другой подход с tidyverse. Он включает в себя проверку row_number в рамках данной проблемы и добавление значения счетчика, если оно появляется после первой подсказки. Затем добавляется кумулятивная сумма этого счетчика.

(Обратите внимание, вы получите предупреждение, если у проблемы нет подсказок.)

library(tidyverse)

data.input %>%
  group_by(user.id, problem.id) %>%
  mutate(count = ifelse(row_number() > min(which(hint.flag == 1)), 1, 0),
         post.hint.attempt = cumsum(count)) %>%
  select(-count) 

Вывод

# A tibble: 18 x 5
# Groups:   user.id, problem.id [5]
   user.id problem.id correctness hint.flag post.hint.attempt
     <dbl> <chr>      <lgl>           <dbl>             <dbl>
 1  540995 A          FALSE               1                 0
 2  540995 A          FALSE               0                 1
 3  540995 A          FALSE               1                 2
 4  540995 B          FALSE               1                 0
 5  540995 B          FALSE               1                 1
 6  540995 B          TRUE                0                 2
 7  540995 C          FALSE               1                 0
 8  540995 C          FALSE               1                 1
 9  540995 C          TRUE                0                 2
10  540995 D          TRUE                0                 0
11  565662 A          TRUE                0                 0
12  565662 A          FALSE               1                 0
13  565662 A          FALSE               0                 1
14  565662 A          FALSE               1                 2
15  565662 A          FALSE               1                 3
16  565662 A          FALSE               0                 4
17  565662 A          FALSE               0                 5
18  565662 A          FALSE               0                 6
1 голос
/ 24 апреля 2020

Это не желаемый вывод, но вы можете рассмотреть его как вариант

data.example %>% 
group_by(user.id, problem.id) %>%
 mutate(total_hints = cumsum(hint.flag), trial=1:n()) %>%
 summarise(hints = last(total_hints),
 trials = last(trial),
 correct = last(correctness))

, который производит

# Groups:   user.id [2]
  user.id problem.id hints trials correct
    <dbl> <chr>      <dbl>  <int> <lgl>  
1  540995 A              2      3 FALSE  
2  540995 B              2      3 TRUE   
3  540995 C              2      3 TRUE   
4  540995 D              0      1 TRUE   
5  565662 A              3      8 FALSE  

Обновление

Это ближе? ? Сначала создайте ключ, затем свяжите и сделайте математику

key <- data.example %>% group_by(user.id, problem.id) %>% mutate(trial=1:n()) %>% filter(hint.flag == 1) %>%
rename(hint_trial = trial)
left_join(data.example, key) %>% 
group_by(user.id, problem.id) %>%
 mutate(trial=1:n(),
 target = trial - first(hint_trial)) 
...