r - 使用 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 个条目。我希望能够应用一个函数来在大型数据集中实现这样的结果。我希望这个编辑能更好地解释我在寻找什么。抱歉之前的帖子,慢慢学习。
谢谢!
解决方案
您可以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
我们可以做到这一点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'))
推荐阅读
- http - PyCharm终端中HTTP响应数字的含义
- quarkus - Quarkus:构建期间的 IllegalArgumentException
- postgresql - Postgres earth 错误:域 earth 的值违反了检查约束“on_surface”
- java - Spring Boot:以编程方式禁用 PersistentBag 的获取
- wordpress - 从 WordPress 中的 WooCommerce 导航栏中删除“空”类别/子类别
- python - 迭代 Tensorfow 数据集总是返回一个不同排序的数组
- c++ - 通过 ADC 和 Arduino 从惠斯通电桥获取的奇怪数据
- azure-cognitive-services - 自定义视觉:超出上传配额
- x86 - 在实模式下通过 gdb 访问 $eip 失败
- objective-c - 设置 tintColor 在窗口不活动时禁用去饱和