R中的序列变换编码
我问了一些非常类似的问题,但我现在对我的问题有了更好的理解。我会尽我所能问清楚 我有一个示例数据集,如下所示:R中的序列变换编码,r,sequence,R,Sequence,我问了一些非常类似的问题,但我现在对我的问题有了更好的理解。我会尽我所能问清楚 我有一个示例数据集,如下所示: id <- c(1,1,1, 2,2,2, 3,3, 4,4, 5,5,5,5, 6,6,6, 7, 8,8, 9,9, 10,10) item.id <- c(1,1,2, 1,1,1 ,1,1, 1,2, 1,2,2,2, 1,1,1, 1, 1,2, 1,1, 1,1) sequence <- c(1,2,1, 1,2,3, 1,2, 1,
id <- c(1,1,1, 2,2,2, 3,3, 4,4, 5,5,5,5, 6,6,6, 7, 8,8, 9,9, 10,10)
item.id <- c(1,1,2, 1,1,1 ,1,1, 1,2, 1,2,2,2, 1,1,1, 1, 1,2, 1,1, 1,1)
sequence <- c(1,2,1, 1,2,3, 1,2, 1,1, 1,1,2,3, 1,2,3, 1, 1,1, 1,2, 1,2)
score <- c(0,0,0, 0,0,1, 2,0, 1,1, 1,0,1,1, 0,0,0, 1, 0,2, 1,2, 2,1)
data <- data.frame("id"=id, "item.id"=item.id, "sequence"=sequence, "score"=score)
> data
id item.id sequence score
1 1 1 1 0
2 1 1 2 0
3 1 2 1 0
4 2 1 1 0
5 2 1 2 0
6 2 1 3 1
7 3 1 1 2
8 3 1 2 0
9 4 1 1 1
10 4 2 1 1
11 5 1 1 1
12 5 2 1 0
13 5 2 2 1
14 5 2 3 1
15 6 1 1 0
16 6 1 2 0
17 6 1 3 0
18 7 1 1 1
19 8 1 1 0
20 8 2 1 2
21 9 1 1 1
22 9 1 2 2
23 10 1 1 2
24 10 1 2 1
分数从0变为1或从0变为2或从1变为2被视为正确的右转,
分数从1到0或从2到0或从2到1的变化被视为不正确的错误变化
如果id=7中只有一次尝试item.id,则状态应为1.right。如果分数是0,那么应该是1。错。同时,分数为1或2时视为正确,分数为0时视为错误
所需的输出将与以下情况有关:
> desired
id item.id status
1 1 1 WW
2 1 2 one.wrong
3 2 1 WR
4 3 1 RW
5 4 1 one.right
6 4 2 one.right
7 5 1 one.right
8 5 2 RR
9 6 1 WW
10 7 1 one.right
11 8 1 one.wrong
12 8 2 one.right
13 9 1 WR
14 10 1 RW
问题的前一个版本的主要区别在于我没有考虑这些变化
a) from 1 to 2 as WR, instead, they were coded as RR,
b) from 2 to 1 as RW, instead, they were coded as WW.
同样,逻辑应该是如果分数增加,它应该是WR,如果它减少,它应该是RW
我得到的最好的回答是
library(dplyr)
library(purrr)
library(forcats)
data %>%
mutate(status = ifelse(score > 0, "R", "W")) %>%
group_by(id, item.id) %>%
filter(sequence == n() - 1 | sequence == n()) %>%
summarise(status = paste(status, collapse = "")) %>%
ungroup() %>%
mutate(status = fct_recode(status, "one.wrong" = "W", "one.right" = "R"))
但我需要处理分数递减/递增模式
有什么意见吗?
谢谢 以下是每行的分类:
library(dplyr)
data = data %>%
group_by(id, item.id) %>%
mutate(diff = c(0, diff(score)),
status = case_when(
n() == 1 & score == 0 ~ "one.wrong",
n() == 1 & score > 0 ~ "one.right",
diff == 0 & score == 0 ~ "WW",
diff == 0 & score > 0 ~ "RR",
diff > 0 ~ "WR",
diff < 0 ~ "RW",
TRUE ~ "oops"
))
print.data.frame(data)
# id item.id sequence score diff status
# 1 1 1 1 0 0 WW
# 2 1 1 2 0 0 WW
# 3 1 2 1 0 0 one.wrong
# 4 2 1 1 0 0 WW
# 5 2 1 2 0 0 WW
# 6 2 1 3 1 1 WR
# 7 3 1 1 2 0 RR
# 8 3 1 2 0 -2 RW
# 9 4 1 1 1 0 one.right
# 10 4 2 1 1 0 one.right
# 11 5 1 1 1 0 one.right
# 12 5 2 1 0 0 WW
# 13 5 2 2 1 1 WR
# 14 5 2 3 1 0 RR
# 15 6 1 1 0 0 WW
# 16 6 1 2 0 0 WW
# 17 6 1 3 0 0 WW
# 18 7 1 1 1 0 one.right
# 19 8 1 1 0 0 one.wrong
# 20 8 2 1 2 0 one.right
# 21 9 1 1 1 0 RR
# 22 9 1 2 2 1 WR
# 23 10 1 1 2 0 RR
# 24 10 1 2 1 -1 RW
这似乎与您想要的输出相匹配。只是一个小提示:data.frame将自动从您提供的变量中提取列名,因此您可以执行数据操作。感谢@Gregor,所有代码都有效,但最后一部分只提供了一个对象a,status=laststatus我获得此状态1,可能您在dplyr之后加载了plyr并忽略了警告。如果显式使用dplyr::summary,它应该可以工作。
library(dplyr)
data = data %>%
group_by(id, item.id) %>%
mutate(diff = c(0, diff(score)),
status = case_when(
n() == 1 & score == 0 ~ "one.wrong",
n() == 1 & score > 0 ~ "one.right",
diff == 0 & score == 0 ~ "WW",
diff == 0 & score > 0 ~ "RR",
diff > 0 ~ "WR",
diff < 0 ~ "RW",
TRUE ~ "oops"
))
print.data.frame(data)
# id item.id sequence score diff status
# 1 1 1 1 0 0 WW
# 2 1 1 2 0 0 WW
# 3 1 2 1 0 0 one.wrong
# 4 2 1 1 0 0 WW
# 5 2 1 2 0 0 WW
# 6 2 1 3 1 1 WR
# 7 3 1 1 2 0 RR
# 8 3 1 2 0 -2 RW
# 9 4 1 1 1 0 one.right
# 10 4 2 1 1 0 one.right
# 11 5 1 1 1 0 one.right
# 12 5 2 1 0 0 WW
# 13 5 2 2 1 1 WR
# 14 5 2 3 1 0 RR
# 15 6 1 1 0 0 WW
# 16 6 1 2 0 0 WW
# 17 6 1 3 0 0 WW
# 18 7 1 1 1 0 one.right
# 19 8 1 1 0 0 one.wrong
# 20 8 2 1 2 0 one.right
# 21 9 1 1 1 0 RR
# 22 9 1 2 2 1 WR
# 23 10 1 1 2 0 RR
# 24 10 1 2 1 -1 RW
summarize(data, status = last(status))
# # A tibble: 14 x 3
# # Groups: id [10]
# id item.id status
# <dbl> <dbl> <chr>
# 1 1 1 WW
# 2 1 2 one.wrong
# 3 2 1 WR
# 4 3 1 RW
# 5 4 1 one.right
# 6 4 2 one.right
# 7 5 1 one.right
# 8 5 2 RR
# 9 6 1 WW
# 10 7 1 one.right
# 11 8 1 one.wrong
# 12 8 2 one.right
# 13 9 1 WR
# 14 10 1 RW