我有这样的数据。
data.input <-read_table2("user.id problem.id first.correct cwa_prob prob.seq
540995 PRABNBZQ 0 1 problem.id.problem.1
540995 PRABNBZ2 1 0 problem.id.problem.2
540995 PRABNBZK 0 1 problem.id.problem.3
540995 PRABNB2B 0 1 problem.id.problem.4
540995 PRABNBWE 0 1 problem.id.problem.5
565662 PRABNB2B 1 0 problem.id.problem.1
565662 PRABNBZQ 1 1 problem.id.problem.2
565662 PRABNBZ9 1 0 problem.id.problem.3
565662 PRABNBZV 1 0 problem.id.problem.4
565662 PRABNBWG 1 0 problem.id.problem.5
")
我试图使用滞后函数来比较两列中一个标志的出现情况。我想看看一个人从一个问题到下一个问题的顺序如何。具体来说,如果 cwa_prob
是 1
对于 problem.id.problem.1
(用户 540995
),是否 first.correct==1
在 problem.id.problem.2
(用户 540995
).
我试过这样的东西,但它给我抛出一个错误。
input.data %>%
group_by(user.id) %>%
mutate(post.cwa.correct=ifelse(cwa_prob==1 & lag(first.correct==1),1,0))
我希望我的输出看起来像这样。
data.output <-read_table2("user.id problem.id first.correct cwa_prob prob.seq post.cwa.correct
540995 PRABNBZQ 0 1 problem.id.problem.1 NA
540995 PRABNBZ2 1 0 problem.id.problem.2 1
540995 PRABNBZK 0 1 problem.id.problem.3 NA
540995 PRABNB2B 0 1 problem.id.problem.4 0
540995 PRABNBWE 0 1 problem.id.problem.5 0
565662 PRABNB2B 1 0 problem.id.problem.1 1
565662 PRABNBZQ 1 1 problem.id.problem.2 NA
565662 PRABNBZ9 1 0 problem.id.problem.3 1
565662 PRABNBZV 1 0 problem.id.problem.4 NA
565662 PRABNBWG 1 0 problem.id.problem.5 NA
")
也许滞后函数不是最好的函数?任何帮助都将不胜感激
根据你的描述,我想这是你想要的。
library(dplyr)
data.input %>%
group_by(user.id) %>%
mutate(post.cwa.correct = as.integer(first.correct == 1 & lag(cwa_prob) == 1))
当当前行的值有 first.correct = 1
和前一行有 cwa_prob = 1
.
注意,你不需要 ifelse(condition, 1, 0)
因为你可以将 TRUE
FALSE
通过将它们转换为整数,将值转换为10。另外,在你的尝试中,你有 lag(first.correct==1)
这与 lag(first.correct) ==1
.
看一看 lag
文件。有一个 order_by
参数,决定记录的排序顺序。
除非你发送了这个参数,否则R会对你的数据集使用现有的默认顺序。所以不同的排序会产生不同的答案。这很可能是你的代码没有工作的一个解释,但@James发现代码运行得很好。
input.data %>%
group_by(user.id) %>%
mutate(post.cwa.correct=ifelse(cwa_prob==1 & lag(first.correct==1, order_by = "prob.seq"),1,0))
请注意,由于这个参数的格式是 prob_seq
是最有可能的人物, order_by
子句将按字母顺序排序。这意味着 'problem.10'
将在 'problem.2'
. 因此,如果你的数据中出现这种情况,你需要提取并将问题号码转换为数字。
我运行了所有的东西,它工作得很好。然而,你列出的想要的输出实际上并不符合你的标准......你要的是
data.input %>%
group_by(user.id) %>%
mutate(post.cwa.correct=ifelse(cwa_prob==0, NA, ifelse(
cwa_prob==1 & lead(first.correct==1),1,0)
))
然而,你把数据集列为 "data.input",但你使用的数据集却被列为 "input.data"。