分组依据并在R中创建列索引

  • 本文关键字:创建 索引 r dplyr rowid
  • 更新时间 :
  • 英文 :


我有一组用户的数据集,他们试图解决一组数学问题。他们被随机地给出一个解决问题的提示(hint.flag(。我想知道用户在看到问题中的第一个提示后,多久会得到每个问题的"正确"答案(Correctivity(。首先,我需要创建某种索引来识别他们在哪个提示后尝试

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.intit.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可能很有用,但由于提示的出现而使尝试次数滞后的需要让我感到困惑。任何帮助都将是惊人的!!!

为了以防万一,这里有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

这不是您想要的输出,但您可能需要将其视为选项

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)) 

相关内容

  • 没有找到相关文章

最新更新