Применить правило, основанное на значениях строк набора данных - PullRequest
0 голосов
/ 29 июня 2018

Я начинающий в R, я уже разработал некоторые программы, но проблема, которую я вам покажу, никогда не возникала со мной. Вот кадр данных TSE, с которым я имею дело:

   ID TIME EVENT
1 150    1     A
2 150    2     B
3 150    2     C
4 150    2     D
5 151    1     C
6 151    2     A
7 151    3     B
8 151    3     D

Этот фрейм данных содержит 3 переменные:

ID: ID человека,

ВРЕМЯ: Индекс времени,

СОБЫТИЕ: Событие, которое происходит в определенный момент времени.

Я хочу удалить строки, для которых происходят два или более события в одно и то же время (ВРЕМЯ) на основе правила. Предположим, что правило таково: C> B> A> D (где «>» означает «предпочтительный»)

Итак, в моем примере я хотел бы сохранить только эти строки:

   ID TIME EVENT
1 150    1     A
3 150    2     C
5 151    1     C
6 151    2     A
7 151    3     B

Вы можете легко увидеть, что строки 2,4,8 исчезли из-за определенного правила

Полагаю, программирование не должно быть таким сложным, но я действительно понятия не имею, как его записать.

Спасибо вам всем в ожидании.

Джереми П.

1 Ответ

0 голосов
/ 30 июня 2018

Вот возможное решение с использованием dplyr.

Сначала воспроизведите ваши данные

DF <- data.frame(ID = rep(150:151, each=4), 
                 time=c(1, 2, 2, 2, 1, 2, 3, 3), 
                 EVENT=c("A", "B", "C", "D", "C", "A", "B", "D"))

target_rule <- c("C", "B", "A", "D")

Затем мы можем использовать комбинацию команд из dplyr для заказа, выбора и т. Д. Ниже я использую факторную версию вашего EVENT, чтобы отсортировать их в соответствии с вашим правилом taget.

library("dplyr")
DF %>% 
  group_by(ID, time) %>%                               # Consider each combo of ID and time    
  mutate(fevent=factor(EVENT, levels=target_rule)) %>% # Create ordered version of EVENT 
  arrange(fevent) %>%                                  # Sort according to rule
  summarise(EVENT=first(EVENT)) %>%                    # Pick just the first 
  ungroup() %>% 
  arrange(ID) 

Это производит

# A tibble: 5 x 5
     ID  time EVENT fevent    rn
  <int> <dbl> <fct> <fct>  <int>
1   150     1 A     A          1
2   150     2 C     C          1
3   151     1 C     C          1
4   151     2 A     A          1
5   151     3 B     B          1
...