Как отфильтровать строки, где значение сильно отличается от других значений? - PullRequest
0 голосов
/ 02 июля 2018

Я хотел бы удалить строки, в которых значение конкретной переменной, HEIGHT_CM, сильно отличается от других значений для того же идентификатора, PATIENT_ID.

  • Отличие> 2 от других значений

Данные:

df <- read.table(text = "PATIENT_ID MEASUREMENT_TAKEN_DATE  HEIGHT_CM
1   20140305    163
1   20140409    163
1   20140528    164
1   20140730    164
1   20141210    99.7
2   20140305    155
2   20140527    157
2   20141111    78
3   20140721    90
4   20140528    168
4   20140627    167
4   20140917    167
4   20141002    70", header = TRUE, stringsAsFactors = FALSE)

Желаемый выход :

df <- read.table(text = "PATIENT_ID MEASUREMENT_TAKEN_DATE  HEIGHT_CM
1   20140305    163
1   20140409    163
1   20140528    164
1   20140730    164
2   20140305    155
2   20140527    157
3   20140721    90
4   20140528    168
4   20140627    167
4   20140917    167", header = TRUE, stringsAsFactors = FALSE)

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Статистический способ удаления выбросов, который дает точный результат:

library(dplyr)
df1 <- df %>% group_by(PATIENT_ID) %>% summarize(s=sd(HEIGHT_CM),m=mean(HEIGHT_CM))
df %>% inner_join(df1,by="PATIENT_ID") %>% 
  filter(is.na(s)|((HEIGHT_CM>m-s)&(HEIGHT_CM<m+s))) %>% select(-c(4,5))
0 голосов
/ 02 июля 2018
library(dplyr)
df <- df %>% 
  group_by(PATIENT_ID) %>% 
  mutate(difference = abs(mean(HEIGHT_CM, na.rm = T) - HEIGHT_CM)) %>% 
  filter(difference <= 50)

Здесь вы фильтруете для difference >= 50, где difference находится между средним значением группы и единственным значением. Вы получите результат, который вы нам показали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...