Использование R: Как выделить случаи по квартальным датам и идентифицировать уникальные случаи по отдельной переменной в каждом квартале? - PullRequest
1 голос
/ 04 апреля 2020

[EDITED 4/4/2020] Это мой первый пост на stackoverflow, и я новый пользователь R. Пожалуйста, прости меня за любые ошибки. Я использую R 3.6.2 с Rstudio. В этом наборе данных я надеюсь найти способ хранить уникальные регистрационные номера в течение каждого квартала года. Многие люди принимают несколько лекарств в одном квартале, я хочу знать, кто принимал какие-либо лекарства в каждом квартале. Таким образом, уникальные идентификаторы в течение каждого квартала года.

> Df<-data.frame(ID= c("123",   "456",  "123", "789",   "123",  "456",  "789",  "123",  "789"),
+                Drug= c("A",   "B",    "C",    "A",    "A",    "A",    "B",    "B",    "A"),
+                Administered= c("2017 Q1", "2018 Q1",  "2017 Q3",  "2017 Q1",  "2017 Q1",  "2018 Q3",  "2018 Q1",  "2017 Q1",  "2018 Q1"))
> 
> dput(Df)  ##Generating dput format
structure(list(ID = structure(c(1L, 2L, 1L, 3L, 1L, 2L, 3L, 1L, 
3L), .Label = c("123", "456", "789"), class = "factor"), Drug = structure(c(1L, 
2L, 3L, 1L, 1L, 1L, 2L, 2L, 1L), .Label = c("A", "B", "C"), class = "factor"), 
    Administered = structure(c(1L, 3L, 2L, 1L, 1L, 4L, 3L, 1L, 
    3L), .Label = c("2017 Q1", "2017 Q3", "2018 Q1", "2018 Q3"
    ), class = "factor")), class = "data.frame", row.names = c(NA, 
-9L))
> 
> str(Df)  ##demonstrating structure of data
'data.frame':   9 obs. of  3 variables:
 $ ID          : Factor w/ 3 levels "123","456","789": 1 2 1 3 1 2 3 1 3
 $ Drug        : Factor w/ 3 levels "A","B","C": 1 2 3 1 1 1 2 2 1
 $ Administered: Factor w/ 4 levels "2017 Q1","2017 Q3",..: 1 3 2 1 1 4 3 1 3
> 
> print(Df)  ##Before removing duplicates
   ID Drug Administered
1 123    A      2017 Q1
2 456    B      2018 Q1
3 123    C      2017 Q3
4 789    A      2017 Q1
5 123    A      2017 Q1
6 456    A      2018 Q3
7 789    B      2018 Q1
8 123    B      2017 Q1
9 789    A      2018 Q1
> 
> library(tidyverse) ##Loading tidyverse for distinct function to remove duplicates
> 
> Df %>% distinct(ID, .keep_all=TRUE) ##Removed duplicate enteries but wanted to remove duplicates IDs within each Year Quarter
   ID Drug Administered
1 123    A      2017 Q1
2 456    B      2018 Q1
3 789    A      2017 Q1
> 
> ##Generating the end result dataset desired where only duplicate ID's within each quarter are removed 
> dfend<-data.frame(ID= c("123",    "456",  "123", "789",   "456",  "789"),
+                   Drug= c("A",    "B",    "C",    "A",    "A",    "B"),
+                   Administered= c("2017 Q1",  "2018 Q1",  "2017 Q3",  "2017 Q1",  "2018 Q3",  "2018 Q1"))
> 
> print(dfend)
   ID Drug Administered
1 123    A      2017 Q1
2 456    B      2018 Q1
3 123    C      2017 Q3
4 789    A      2017 Q1
5 456    A      2018 Q3
6 789    B      2018 Q1

Итак, как вы можете видеть, когда я использовал функцию дублирования, она удаляла все дубликаты ID, а я хотела удалить только дубликаты в течение того же квартала года. Я указал желаемый результат в кадре данных dfend, где случаи 5, 8 и 9 были удалены, поскольку они были дублирующими идентификаторами в том же квартале года. Эти данные являются образцом, который я создал на основе моего исходного набора данных, который содержит> 1500 записей. Я хотел бы иметь возможность применить функцию для достижения таких результатов в большом наборе данных. Я надеюсь, что это редактирование лучше объясняет, что я ищу. Извиняюсь за предыдущий пост, потихоньку учусь.

Спасибо!

1 Ответ

0 голосов
/ 05 апреля 2020

Вы можете использовать duplicated для выбранных столбцов.

Df[!duplicated(Df[c(1,3)]),]

#   ID Drug Administered
#1 123    A      2017 Q1
#2 456    B      2018 Q1
#3 123    C      2017 Q3
#4 789    A      2017 Q1
#6 456    A      2018 Q3
#7 789    B      2018 Q1

Используя dplyr, мы можем group_by ID и Administered выбрать 1-ую строку в каждой группе.

Мы можем сделать это с slice

library(dplyr)
Df %>% group_by(ID, Administered) %>%  slice(1L)

Или с filter

Df %>% group_by(ID, Administered) %>%  filter(row_number() == 1)

В data.table мы можем использовать unique и укажите, по каким столбцам мы хотим проверить уникальность.

library(data.table)
unique(setDT(Df), by = c('ID', 'Administered'))
...