【问题标题】:Using the lag function with two different columns R使用具有两个不同列 R 的滞后函数
【发布时间】:2020-06-02 22:48:35
【问题描述】:

我有这样的数据。

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

我正在尝试使用 lag 函数来比较两个单独列中出现的标志。我想看看一个人如何按顺序从一个问题到下一个问题。具体来说,如果cwa_prob对于problem.id.problem.1(用户540995)是1,是不是problem.id.problem.2(用户540995)中的first.correct==1

我尝试了类似的方法,但它引发了错误。

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】:

根据您的描述,我认为这就是您想要的:

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 不同。

【讨论】:

  • 这太棒了@Ronak Shah。谢谢!
【解决方案2】:

查看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' 之前。因此,如果您的数据中出现这种情况,您需要提取问题编号并将其转换为数字。

【讨论】:

    【解决方案3】:

    我运行了所有程序,并且运行良好。但是,您列出的想要的输出实际上并不符合您的标准......您想要

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多