r - 从数据集中仅提取第一次出现的行的有效方法是什么?

标签 r dplyr

我有一个包含患者遭遇的数据框,并且只想为每个患者提取最旧的遭遇(这可以使用顺序遭遇 ID 来完成)。我想出的代码有效,但我确信使用 dplyr 有更有效的方法来执行此任务。你会推荐什么方法?

4 名患者 10 次接触的示例:

encounter_ID <- c(1021, 1022, 1013, 1041, 1007, 1002, 1003, 1043, 1085, 1077)
patient_ID <- c(855,721,821,855,423,423,855,721,423,855)
gender <- c(0,0,1,0,1,1,0,0,1,0)
df <- data.frame(encounter_ID, patient_ID, gender)

结果(期望和获得):
    encounter_ID    patient_ID  gender
    1003            855         0
    1022            721         0
    1013            821         1
    1002            423         1

我的方法

1)提取唯一患者的列表
list.patients <- unique(df$patient_ID)

2)创建一个空的数据框来接收我们每个病人第一次遇到的输出
one.encounter <- data.frame()

3)遍历列表中的每个患者以提取他们的第一次遭遇并填充我们的数据框
for (i in 1:length(list.patients)) {
one.patient <- df %>% filter(patient_ID==list.patients[i])
one.patient.ordered <- one.patient[order(one.patient$encounter_ID),]
first.encounter <- head(one.patient.ordered, n=1)
one.encounter <- rbind(one.encounter, first.encounter)
} 

最佳答案

这是一个基本的 R 解决方案,可以在没有 dplyr 的情况下有效地做到这一点
duplicated将遇到的具有特定患者 ID 的第一行编码为 FALSE ,以及与 TRUE 具有相同患者 ID 的所有后续行(在这里,我通过在 ! 之前添加 duplicated 来扭转这一点),因此如果您已通过遇到_ID 对数据框进行排序,则可以使用它来仅选择第一次遇到

df <- df[order(df$encounter_ID),] #order dataframe by encounter id
#subset to rows that are not duplicates of a previous encounter for that patient
first <- df[!duplicated(df$patient_ID),]

关于r - 从数据集中仅提取第一次出现的行的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51773889/

相关文章:

r - 从组内的两列中提取最大值

r - 合并 tibble 中的行

R 以一定的容差叠加点和多边形

r - 如何使用 tidyverse 计算行和

r - 具有多个条件的内连接 r 数据表

r - 更改 alpha 不会影响 ggplot2 中的任何内容

r - 使用 dplyr 减去几个不同列的最有效方法是什么

r - 如何将多列中的 NA 替换为同一数据集中其他相应多列的值?

r - 在 metafor 中拟合具有 200 个效果大小的多元(多级)模型(rma.mv 和 optimParallel)失败

r - 如何在 R 中最小化此功能?