【问题标题】:Using R: How to subselect cases by quarterly dates and identify unique cases by a separate variable within each quarter?使用 R:如何按季度日期对案例进行细分,并通过每个季度内的单独变量识别独特案例?
【发布时间】:2020-07-16 09:35:07
【问题描述】:

[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 个条目。我希望能够应用一个函数来在大型数据集中实现这样的结果。我希望这个编辑能更好地解释我在寻找什么。抱歉之前的帖子,慢慢学习。

谢谢!

【问题讨论】:

  • 图片是一种非常糟糕的发布数据(或代码)的方式。您可以以dput 格式发布示例数据吗?请使用您尝试过的代码和dput(df) 的输出来编辑问题。或者,如果 dput(head(df, 20)) 的输出太大。 (df 是数据集的名称。)
  • 您可以编辑您的问题以回复 cmets。
  • 嗨,斯兰曼。请显示您的代码,至少是一个 sn-p。对我来说,作为一个读者,代码是我首先要寻找的东西。谢谢。
  • @RonakShah 预期输出是本次编辑中的 dfend 数据集。
  • @RuiBarradas 我已经发布了生成示例数据帧的代码,并在此编辑中提供了 dput(df) 结果。

标签: r date unique


【解决方案1】:

您可以在选定的列上使用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'))

【讨论】:

  • 哇,谢谢!这些是获得我需要的东西的很多方法。非常感谢!这真太了不起了!然而,有人对我的问题(我认为他们记下了)发布了一个先前的解决方案,该解决方案是使用:``` Df %>% distinct(ID, Administered, .keep_all = TRUE) ``` 3 个进一步的问题:1. 是也可以这样使用“distinct”功能吗? 2. 在所有这些中,您最喜欢的方法是什么? 3. 在所有这些方法中,使用所有 3 个变量(即 ID、药物、管理)来识别独特病例是可以接受和准确的吗?如果您也能回答这些问题,我将不胜感激。谢谢!
  • 1.是的,您可以这样使用distinct。 2. 我的首选方式是第一种使用duplicated,因为它是基础 R 并且不使用任何包。 3. 我想那是准确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2017-03-20
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
相关资源
最近更新 更多