2016-07-03 8 views
0

データフレームがあるため、月ごとに3つのグループに分割する必要があります。データフレーム内のシーケンスでグループ化するR

  • グループ1:ヶ月月2
  • で1,2 &投薬変更グループ2:月の3ヶ月で1,2,3 &投薬変更
  • グループ3:月1,2,3、 4、上向き&月4日の薬剤の変更

3つのグループで使用する各薬剤(合計5薬剤)の頻度、平均、SE。

ID <- c(1,1,2,2,2,2,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,6,6,7,7,8,8,8,8) 
month <- c(1,2,1,2,3,4,1,2,3,4,5,1,2,3,1,2,3,4,5,1,2,3,4,1,2,1,2,3,4) 
med <- c(1,1,2,2,2,3,4,4,4,4,4,1,1,1,6,6,7,7,7,3,3,3,3,1,1,5,5,5,5) 
mean <- c(4,6,5,2,3,7,5,7,1,3,6,7,5,2,3,3,3,3,3,5,6,7,8,1,6,4,5,6,7) 
df <- data.frame(ID,month,med,mean) 
df 

    ID month med mean 
1 1  1 1 4 
2 1  2 1 6 
3 2  1 2 5 
4 2  2 2 2 
5 2  3 2 3 
6 2  4 3 7 
7 3  1 4 5 
8 3  2 4 7 
9 3  3 4 1 
10 3  4 4 3 
11 3  5 4 6 
12 4  1 1 7 
13 4  2 1 5 
14 4  3 1 2 
15 5  1 6 3 
16 5  2 6 3 
17 5  3 7 3 
18 5  4 7 3 
19 5  5 7 3 
20 6  1 3 5 
21 6  2 3 6 
22 6  3 3 7 
23 6  4 3 8 
24 7  1 1 1 
25 7  2 1 6 
26 8  1 5 4 
27 8  2 5 5 
28 8  3 5 6 
29 8  4 5 7 

グループ1に、彼らはあなたの場合は、グループ3、メッド= 2にすべきで、メッド= 1

  • ID = 2を使用する必要があり、私は、8 ID

    • ID = 1を持っていますメドをチェックすると、彼らは2と 3を使用しますが、少なくとも2の最初を保持するとすぐにグループ3に設定します。3ヶ月目にMedを変更すると、グループ2に設定します。グループ1に設定しました。
    • ID = 3、グループ3にする必要があります。Med = 4
    • ID = 4、べき= 1
    • ID = 5グループ2メッド、べきグループ2のメッド= 6で
    • ID = 6、グループ3.メッド= 3
    • ID = 7にすべき、グループに= 8 1.メッド= 1
    • IDは、= 5

    グループ3メッドで私のデータが大である必要がありますする必要があり、私はdata.table使用しようが、私は分割する方法がわかりませんそれ。

  • +0

    'tapply'の使い方を学ぶと、' R'の親友になります。 –

    +0

    希望の出力が条件論理にどのように適合するかわかりません。グループが薬を変更する何かを持っているようには思われません。例えばグループ5の場合、それは3ヶ月目に投薬を変更しますが、それでもグループ3ですか? – Psidom

    +0

    申し訳ありませんが、グループ2 @​​Psidomになっています – BIN

    答えて

    1

    私はあなたのロジックを正しく理解していれば、このように修正することができます。投薬の変更がなければ、グループは月数で決定されます。それ以外の場合は、薬物療法が切り替えられると、このような場合には、次のようdata.tableを使用して、それを達成することができた月によって決定されます。

    setDT(df)[, list({medSwitch = which(c(0, diff(med)) != 0); 
            Group = ifelse(length(medSwitch) == 0, 
               ifelse(.N <= 4, .N - 1, 3), 
               ifelse(min(medSwitch) <= 4, min(medSwitch) - 1, 3))}), .(ID)] 
    # ID V1 
    # 1: 1 1 
    # 2: 2 3 
    # 3: 3 3 
    # 4: 4 2 
    # 5: 5 2 
    # 6: 6 3 
    # 7: 7 1 
    # 8: 8 3 
    

    インプレース変異を探している場合、すなわちにグループを追加します元のデータフレームではなく、要約の上記のように、あなたが行うことができます:

    setDT(df)[, Group := list({medSwitch = which(c(0, diff(med)) != 0); 
              ifelse(length(medSwitch) == 0, 
                ifelse(.N <= 4, .N - 1, 3), 
                ifelse(min(medSwitch) <= 4, min(medSwitch) - 1, 3))}), .(ID)] 
    

    注:結果は、ご希望の出力と一致しますが、あなたがあなたの質問の冒頭で定義された条件とは異なります。おそらく&の代わりに|を意味する可能性がありますか?

    +0

    どのようにdata.tableにグループのnrowを設定すると、私はこの方法でsetDT(df)を管理します。 [、group:= ifelse(lenght(ID)== 2,1、ifelse(lenght(ID)== 3,2,3))、by = ID]。これだけが必要です – BIN

    +0

    '.N'は各グループ内の行数を表します。あなたが必要とするものなら 'setDT(df)[、group:= ifelse(.N == 2、1、ifelse(.N == 3,2,3))、by = ID]'です。 – Psidom

    +2

    @Psidom '.N'はスカラーなので、' group:= if(.N == 2)1 else if(.N == 3)2 else 3'はあなたのコメントに関して働くはずです – Frank

    関連する問題