在 R 中分组并创建列索引
Group By and Create an Column Index in R
我有一个尝试一组数学问题的用户数据集。他们随机获得解决问题的提示 (hint.flag)。我想知道用户在看到问题中的第一个提示后,多快得到每个问题的 "correct" 答案(正确性)。首先,我需要创建某种索引来识别它们正在进行的 post 提示尝试。
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)。
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 可能有用,但需要通过出现提示来延迟尝试次数让我感到困惑。任何帮助都会很棒!!!
这不是您想要的输出,但您可以考虑将其作为一个选项
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))
为了以防万一,这里是 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
我有一个尝试一组数学问题的用户数据集。他们随机获得解决问题的提示 (hint.flag)。我想知道用户在看到问题中的第一个提示后,多快得到每个问题的 "correct" 答案(正确性)。首先,我需要创建某种索引来识别它们正在进行的 post 提示尝试。
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)。
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 可能有用,但需要通过出现提示来延迟尝试次数让我感到困惑。任何帮助都会很棒!!!
这不是您想要的输出,但您可以考虑将其作为一个选项
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))
为了以防万一,这里是 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