

R3.3.2とパッケージtidyverseを用いて前処理中です。  
以下のようなデータなのですが、同じidについて複数回調査(chousaが調査回数）しています。  
同じ調査項目（今回はQ1)が0から1に変わってから1回目、2回目、…4回目までのデータがほしいです。  
どのようにmutateすればよいでしょうか？  
よろしくお願いします。

[code]

    ID　Q1　Q6　chousa　…
    1    0   3 　  1
    1    1  23     2 
    1    1
    2    0  27     3 
    2    0  28     4 
    2    1  29     5
    
[/code]

これの場合は

[code]

    ID change1 change2 … 
     1    　0        0
     1　　　1        0
     1      0        1
     2      0        0
     2      0        0
     2      1        0
    
[/code]

となるようにしたいです。

**追記**  
同一IDについてQ1が0,0,1,1,1,1,0と来たら

[code]

    change1:0,0,1,0,0,0,0
    change2:0,0,0,1,0,0,0
    change3:0,0,0,0,1,0,0
    change4:0,0,0,0,0,1,0
    change5:0,0,0,0,0,0,0
    
[/code]

となるようにしたいです。

[code]

    mutate(change1=ifelse(Q1==1&Q1-lag(Q1)==1,1,0),
    change2=ifelse(Q1==1&lag(change1)==1,1,0),
    change3=ifelse(Q1==1&lag(change2)==1,1,0),
    change4=ifelse(Q1==1&lag(change3)==1,1,0))
    
[/code]

で行けるような気がしますが

[code]

    id chousa change1 change2 change3
     5      2       1       0       0
     5      3       0       1       0
     5      4       0       0       1
    
[/code]

となってほしいものが

[code]

    id chousa change1 change2 change3
     5      2       0       0       1
     5      3       0       1       0
     5      4       1       0       0
    
[/code]

と反対になってしまいます。group_byした時にIDの昇順降順が逆になっているようなのですがどうしたら良いのでしょうか…

→group_by(ID)だけでなくその後にarrange(ID,chousa) で解決しました。


CC BY-SA 3.0
2017-01-25T10:33:56.033
32150
2020-11-29T05:08:20.837
2017-01-26T09:15:36.563
12457
12457
question
r
Rで同じidのカラム内の変数の移行のチェック


質問がきちんと理解できていませんが、次のようにすれば希望の形が出力されます。  
（change1、change2の判定がわかりにくい）

IDごとに処理するのがミソになるのだと思います。

[code]

    library(tidyverse)
    data_frame(
         ID    = c(rep(1, 3), rep(2, 3)),
         Q1    = c(0, 1, 1, 0, 0, 1),
         chosa = c(1, 2, NA, 3, 4, 5)
    ) %>% 
      # IDごとに集計
      group_by(ID) %>% 
        # change1: 対象行のQ1と対象行から次の行のQ1の値を引く
        #   このときIDの先頭行はNAとなり、連続値の時には0となる
        # change2: change1の値とQ1の値の差分をとり、Q1に同じ値が続く場合に1となるようにする
      mutate(change1 = Q1 - lag(Q1),
             change2 = Q1 - change1) %>% 
      ungroup() %>% 
      # NAを0として処理する
      mutate_at(num_range("change", 1:2), funs(ifelse(test = is.na(.), yes = 0, no = .))) %>% 
      select(ID, num_range("change", 1:2))
    
[/code]

ロジックが理解できていないので、データ数が増えるとダメになるかもしれません。ご参考までに。


CC BY-SA 3.0
2017-01-25T12:00:41.933
32154
2017-01-25T12:00:41.933
6020
32150
answer