簡體   English   中英

使用帶有兩個不同列 R 的滯后 function

[英]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    
")

我正在嘗試使用滯后 function 來比較兩個單獨列中標志的出現。 我想看看一個人如何按順序從一個問題到下一個問題。 具體來說,如果問題.id.problem.1 (用戶540995 )的cwa_prob1 ,那么problem.id.problem.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)) 

我希望我的 output 看起來像這樣:

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

也許滯后 function 不是最好的 function ? 任何幫助表示贊賞!

根據您的描述,我認為這就是您想要的:

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值轉換為 integer 將它們轉換為 1/0。 同樣在您的嘗試中,您有lag(first.correct==1)lag(first.correct) ==1不同。

我跑了一切,它工作得很好。 但是,您列出的想要的 output 實際上並不符合您的標准……您想要

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 將使用數據集的現有/默認順序。 所以不同的排序會產生不同的答案。 這可能是您的代碼無法運行的原因,但@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'之前。 因此,如果您的數據中出現這種情況,您需要提取問題編號並將其轉換為數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM