2016-07-03 2 views
0

У меня есть фрейм данных, мне нужно разделить на 3 группы в зависимости от месяца.Группа по последовательности в кадре данных в R

  • Группа 1: 1,2 мес изменения & лекарства в месяц 2
  • Группа 2: месяц 1,2,3 изменение & лекарства в месяц 3
  • Группа 3: месяц 1,2,3, 4, up & изменение объема препарата на месяц 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-й группе, они используют Med = 1.
  • ID = 2, должна в 3-й группе, Med = 2, если вы check Med, они используют 2 и 3, но как только они держат хотя бы первый из 2, я назначил их в группе 3. Если они меняют Med в 3-м месяце, я устанавливаю их в группу 2. Если они меняют меди на 2-й месяц , Я установил их в группу 1.
  • ID = 3, в группе 3. Med = 4
  • J = 4, следует в группе 2. Мед = 1
  • J = 5, следует в группе 2. Мед = 6
  • J = 6, должны в группе 3. Мед = 3
  • , J = 7, следует в группе 1. Med = 1
  • ID = 8, следует в группе 3. Med = 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, я управляю таким образом, setDT (df) [, group = = ifelse (длина) = 2,1, ifelse (длина (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

Смежные вопросы