r按拆分规则重新编码

r按拆分规则重新编码,r,recode,R,Recode,我有一个学生数据集,包括学生信息、questionid(5个问题)、回答问题的每个试验的顺序。我想创建一个变量来区分学生在完成所有问题后从何处开始复习问题 以下是一个示例数据集: data <- data.frame( person = c(1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2), question = c(1,2,2,3,3,3,4,3,5,1,2, 1,1,1,2,3,4,4,4,5,5,4,3,4,4,5

我有一个学生数据集,包括学生信息、
question
id(5个问题)、回答问题的每个试验的
顺序。我想创建一个变量来区分学生在完成所有问题后从何处开始复习问题

以下是一个示例数据集:

data <- data.frame(
person =   c(1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2),
question = c(1,2,2,3,3,3,4,3,5,1,2, 1,1,1,2,3,4,4,4,5,5,4,3,4,4,5,4,5),
sequence = c(1,1,2,1,2,3,1,4,1,2,3, 1,2,3,1,1,1,2,3,1,2,4,2,5,6,3,7,4))

data
   person question sequence
1       1        1        1
2       1        2        1
3       1        2        2
4       1        3        1
5       1        3        2
6       1        3        3
7       1        4        1
8       1        3        4
9       1        5        1
10      1        1        2
11      1        2        3
12      2        1        1
13      2        1        2
14      2        1        3
15      2        2        1
16      2        3        1
17      2        4        1
18      2        4        2
19      2        4        3
20      2        5        1
21      2        5        2
22      2        4        4
23      2        3        2
24      2        4        5
25      2        4        6
26      2        5        3
27      2        4        7
28      2        5        4
有什么想法吗?
谢谢

一种方法是找到复习开始的位置(即第五个问题出现后的下一个条目)以及顺序是2的位置。请参见
v1
v2
。然后,通过为每个人进行子集设置并按每个子集循环,您可以更新
trunt
变量缺少的条目,因为现在已经知道审查从哪里开始

v1 <- c(FALSE, (data$question == 5)[-(nrow(data))])
v2 <- data$sequence == 2
data$attempt <- ifelse(v1 * v2 == 1, "review", NA)
persons <- unique(data$person)

persons.list <- vector(mode = "list", length = length(persons))

for(i in 1:length(persons)){      
  person.i <- subset(data, person == persons[i])
  n <- which(person.i$attempt == "review")
  m <- nrow(person.i)
  person.i$attempt[(n+1):m] <- "review" 
  person.i$attempt[which(is.na(person.i$attempt))] <- "initial"

  persons.list[[i]] <- person.i
}

do.call(rbind, persons.list)
   person question sequence attempt
1       1        1        1 initial
2       1        2        1 initial
3       1        2        2 initial
4       1        3        1 initial
5       1        3        2 initial
6       1        3        3 initial
7       1        4        1 initial
8       1        3        4 initial
9       1        5        1 initial
10      1        1        2  review
11      1        2        3  review
12      2        1        1 initial
13      2        1        2 initial
14      2        1        3 initial
15      2        2        1 initial
16      2        3        1 initial
17      2        4        1 initial
18      2        4        2 initial
19      2        4        3 initial
20      2        5        1 initial
21      2        5        2  review
22      2        4        4  review
23      2        3        2  review
24      2        4        5  review
25      2        4        6  review
26      2        5        3  review
27      2        4        7  review
28      2        5        4  review

v1一种方法是找到复习的开始位置(即第五个问题出现后的下一个条目)和顺序是2。请参见
v1
v2
。然后,通过为每个人进行子集设置并按每个子集循环,您可以更新
trunt
变量缺少的条目,因为现在已经知道审查从哪里开始

v1 <- c(FALSE, (data$question == 5)[-(nrow(data))])
v2 <- data$sequence == 2
data$attempt <- ifelse(v1 * v2 == 1, "review", NA)
persons <- unique(data$person)

persons.list <- vector(mode = "list", length = length(persons))

for(i in 1:length(persons)){      
  person.i <- subset(data, person == persons[i])
  n <- which(person.i$attempt == "review")
  m <- nrow(person.i)
  person.i$attempt[(n+1):m] <- "review" 
  person.i$attempt[which(is.na(person.i$attempt))] <- "initial"

  persons.list[[i]] <- person.i
}

do.call(rbind, persons.list)
   person question sequence attempt
1       1        1        1 initial
2       1        2        1 initial
3       1        2        2 initial
4       1        3        1 initial
5       1        3        2 initial
6       1        3        3 initial
7       1        4        1 initial
8       1        3        4 initial
9       1        5        1 initial
10      1        1        2  review
11      1        2        3  review
12      2        1        1 initial
13      2        1        2 initial
14      2        1        3 initial
15      2        2        1 initial
16      2        3        1 initial
17      2        4        1 initial
18      2        4        2 initial
19      2        4        3 initial
20      2        5        1 initial
21      2        5        2  review
22      2        4        4  review
23      2        3        2  review
24      2        4        5  review
25      2        4        6  review
26      2        5        3  review
27      2        4        7  review
28      2        5        4  review

v1这是一个多么具有挑战性的问题。花了将近2个小时才找到解决方案

试试这个

library(dplyr)

dist_cum <- function(var)
  sapply(seq_along(var), function(x) length(unique(head(var, x))))

data %>% 
  mutate(var0 = n_distinct(question)) %>%
  group_by(person) %>% 
  mutate(var1 = dist_cum(question),
         var2 = cumsum(c(1, diff(question) != 0))) %>%
  ungroup() %>%
  mutate(var3 = if_else(sequence == 1 | var1 < var0, 0, 1)) %>%
  group_by(person, var2) %>%
  mutate(var4 = min(var3)) %>%
  ungroup() %>%
  mutate(attemp = if_else(var4 == 0, "initial", "review")) %>%
  select(-starts_with("var")) %>%
  as.data.frame

dist_cum
是一个计算滚动的函数()
var0
var4
是助手

这是一个多么具有挑战性的问题。花了将近2个小时才找到解决方案

试试这个

library(dplyr)

dist_cum <- function(var)
  sapply(seq_along(var), function(x) length(unique(head(var, x))))

data %>% 
  mutate(var0 = n_distinct(question)) %>%
  group_by(person) %>% 
  mutate(var1 = dist_cum(question),
         var2 = cumsum(c(1, diff(question) != 0))) %>%
  ungroup() %>%
  mutate(var3 = if_else(sequence == 1 | var1 < var0, 0, 1)) %>%
  group_by(person, var2) %>%
  mutate(var4 = min(var3)) %>%
  ungroup() %>%
  mutate(attemp = if_else(var4 == 0, "initial", "review")) %>%
  select(-starts_with("var")) %>%
  as.data.frame

dist_cum
是一个计算滚动的函数()
var0
var4
是帮助者

请展示您迄今为止尝试过的内容。您可以检查您的预期输出吗?我认为与你的要求有些不一致。在第20行,第二个学生看到问题编号5(以及所有问题)。在第21行,同一个学生再次提出同一个问题;因此,我希望第21行中的
尝试
的值是
review
,而不是
initial
。我是对的,还是我遗漏了什么?很抱歉,我的回答太晚了,我也需要详细说明一下,但重温最后一个问题不被视为“回顾”。学生应完成所有问题,包括第二个/第三个/。复习,但学生必须转到前一个问题,即尝试变量被视为“复习”的点。你有解决办法吗?再次为迟到表示歉意。请展示您迄今为止所做的努力。您能检查一下预期的输出吗?我认为与你的要求有些不一致。在第20行,第二个学生看到问题编号5(以及所有问题)。在第21行,同一个学生再次提出同一个问题;因此,我希望第21行中的
尝试
的值是
review
,而不是
initial
。我是对的,还是我遗漏了什么?很抱歉,我的回答太晚了,我也需要详细说明一下,但重温最后一个问题不被视为“回顾”。学生应完成所有问题,包括第二个/第三个/。复习,但学生必须转到前一个问题,即尝试变量被视为“复习”的点。你有解决办法吗?再次为迟到表示歉意。你在这件事上的时间非常宝贵
   person question sequence  attemp
1       1        1        1 initial
2       1        2        1 initial
3       1        2        2 initial
4       1        3        1 initial
5       1        3        2 initial
6       1        3        3 initial
7       1        4        1 initial
8       1        3        4 initial
9       1        5        1 initial
10      1        1        2  review
11      1        2        3  review
12      2        1        1 initial
13      2        1        2 initial
14      2        1        3 initial
15      2        2        1 initial
16      2        3        1 initial
17      2        4        1 initial
18      2        4        2 initial
19      2        4        3 initial
20      2        5        1 initial
21      2        5        2 initial
22      2        4        4  review
23      2        3        2  review
24      2        4        5  review
25      2        4        6  review
26      2        5        3  review
27      2        4        7  review
28      2        5        4  review