使用具有两个不同列 R 的滞后函数
Using the lag function with two different columns R
我有这样的数据。
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
对于problem.id.problem.1
(用户540995
)是1
,那么first.correct==1
in 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
")
也许滞后函数不是最好的函数?任何帮助表示赞赏!
我 运行 一切,它工作正常。然而,您列出的想要的输出实际上并不符合您的标准......您想要
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."
查看 lag
文档。有一个 order_by
参数决定了记录的排序顺序。
除非您发送此参数,否则 R 会对您的数据集使用 existing/default 顺序。所以不同的顺序会产生不同的答案。这可能解释了为什么您的代码不起作用,但@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'
之前。因此,如果您的数据中出现这种情况,您需要提取问题编号并将其转换为数字。
根据您的描述,我认为这就是您想要的:
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
时,这将给出值 1。
请注意,您不需要 ifelse(condition, 1, 0)
,因为您可以通过将 TRUE
/FALSE
值转换为整数来将它们转换为 1/0。同样在您的尝试中,您有 lag(first.correct==1)
不同于 lag(first.correct) ==1
.
我有这样的数据。
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
对于problem.id.problem.1
(用户540995
)是1
,那么first.correct==1
in 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
")
也许滞后函数不是最好的函数?任何帮助表示赞赏!
我 运行 一切,它工作正常。然而,您列出的想要的输出实际上并不符合您的标准......您想要
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."
查看 lag
文档。有一个 order_by
参数决定了记录的排序顺序。
除非您发送此参数,否则 R 会对您的数据集使用 existing/default 顺序。所以不同的顺序会产生不同的答案。这可能解释了为什么您的代码不起作用,但@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'
之前。因此,如果您的数据中出现这种情况,您需要提取问题编号并将其转换为数字。
根据您的描述,我认为这就是您想要的:
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
时,这将给出值 1。
请注意,您不需要 ifelse(condition, 1, 0)
,因为您可以通过将 TRUE
/FALSE
值转换为整数来将它们转换为 1/0。同样在您的尝试中,您有 lag(first.correct==1)
不同于 lag(first.correct) ==1
.