首页 > 解决方案 > 使用 R:如何按季度日期对案例进行细分,并通过每个季度内的单独变量识别独特案例?

问题描述

[编辑于 2020 年 4 月 4 日] 这是我在 stackoverflow 上的第一篇文章,我是新的 R 用户。请原谅我的任何错误。我将 R 3.6.2 与 Rstudio 一起使用。在这个数据集中,我希望找到一种方法来在一年的每个季度中保留唯一的 ID 案例。许多人在同一季度服用多种药物,我想知道每个季度谁服用了任何药物。所以每年每个季度都有唯一的 ID。

> 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,而我只想在同一季度删除重复的 ID。我已经在“dfend”数据框中提供了我想要的输出,其中案例 5、8 和 9 已被删除,因为它们是同一季度内的重复 ID。该数据是我根据我的原始数据集创建的样本,该数据集具有 >1500 个条目。我希望能够应用一个函数来在大型数据集中实现这样的结果。我希望这个编辑能更好地解释我在寻找什么。抱歉之前的帖子,慢慢学习。

谢谢!

标签: rdateunique

解决方案


您可以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 IDAdministered

我们可以做到这一点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'))

推荐阅读