使用两个不同列的滞后函数R

问题描述 投票:0回答: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_prob1 对于 problem.id.problem.1 (用户 540995),是否 first.correct==1problem.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
")

也许滞后函数不是最好的函数?任何帮助都将不胜感激

r dplyr lag
1个回答
1
投票

根据你的描述,我想这是你想要的。

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) 因为你可以将 TRUEFALSE 通过将它们转换为整数,将值转换为10。另外,在你的尝试中,你有 lag(first.correct==1) 这与 lag(first.correct) ==1.


0
投票

看一看 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'. 因此,如果你的数据中出现这种情况,你需要提取并将问题号码转换为数字。


0
投票

我运行了所有的东西,它工作得很好。然而,你列出的想要的输出实际上并不符合你的标准......你要的是

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"。

© www.soinside.com 2019 - 2024. All rights reserved.