2016-07-03 44 views
0

我有數據幀,需要根據月份分成3組。按數據幀中的一個序列組R

  • 組1:一個月月2
  • 1,2- &用藥變化第2組:在第3個月一個月1,2,3- &用藥變化
  • 組3:月1,2,3,如圖4所示,向上&用藥變化在月4

計數頻率,均值,每次用藥的SE(總共5種藥物)通過它們3組使用。

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 

我已經8 ID

  • ID = 1時,應在第1組,他們使用醫學= 1
  • ID = 2時,應在第3組,地中海= 2,如果檢查Med,他們使用2和 3,但只要他們至少保持第一個2,我就將他們設置在第3組。如果他們在第3個月更改Med,我將他們設置爲第2組。如果他們在第2個月,我將它們設置在第1組中。
  • ID = 3,應該在第3組中。Med = 4
  • ID = 4時,應在第2組醫學= 1
  • ID = 5時,應在第2組醫學= 6
  • ID = 6,應該在3組地中海= 3
  • ID = 7,應在第1組中值= 1
  • ID = 8,應在3組中值= 5

我的數據是大的,我嘗試使用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否則if(.N == 3)2 else 3'應該可以工作(關於你的評論) – Frank

相關問題