如何从最后一行重复观察中制作子集数据框?

Posted

技术标签:

【中文标题】如何从最后一行重复观察中制作子集数据框?【英文标题】:How to make a subset dataframe from the last row of repeated observations? 【发布时间】:2016-06-21 13:26:25 【问题描述】:

简单的问题。我有一个数据框,其中受试者对时间变量和状态变量(死亡/活着)有不同的观察。我想从每个受试者的最后一次观察中制作一个子集,但由于每个受试者的观察次数是可变的,并且有来自 690 名受试者的 1143 次观察,手动挑选它们会让人头疼。聚合不会起作用,因为每个主题的最后一次观察已经是前一个的聚合“时间值”。

       name visit.date status

30   20        337      1
31   20        421      1
32   20        502      0  <- Row to subset
33   21        427      0  <- Row to subset
34   22         NA     NA  <- Row to subset
35   23        800      1
36   23        882      0  <- Row to subset
37   24        157      1
38   24        185      1
39   24        214      1
40   24        298      1
41   24        381      1  <- Row to subset
42   25        386      1  <- Row to subset
43   26         NA     NA  <- Row to subset
44   27        522      1
45   27        643      1
46   27        711      1  <- Row to subset
47   28        280      0  <- Row to subset
48   29        227      1
49   29        322      1
50   29        335      0  <- Row to subset

如您所见,有些主题只有一个观察值,我会保留这些,但有 2,3 个或更多观察值的主题。我如何对这些进行子集化并制作一个数据框,每个主题只有 1 个观察值(总共 620 行)。这是为了生存分析,我可以按原样对数据帧进行分析,但我无法对这个数据帧进行 coxph,因为我要对比的自变量长度仅为 620(每个受试者 1 个)。

提前谢谢你!

【问题讨论】:

使用 dplyr,DF %&gt;% group_by(name) %&gt;% slice(n()) 可以工作,因为n() 是每个组中的行数,slice 选择每个组中的行号。 可以使用duplicated,即df[!duplicated(df$name, fromLast = TRUE),] 【参考方案1】:

这是使用dplyr的解决方案:

library(dplyr)
df %>%  group_by(name) %>% filter(row_number()==n()) 

【讨论】:

看起来这样就行了,row_number() == n() 是做什么的? 它创建了一个逻辑向量作为过滤的基础。 row_number 包含每个组内的行号,n() 是每个组内的行数。因此,它只为每个组内的最后一行返回TRUE。你可以试试df %&gt;% group_by(name) %&gt;% mutate( rownum = row_number()) 看看row_number是怎么工作的【参考方案2】:
df[c(df$name[-nrow(df)]!=df$name[-1L],T),];
##    name visit.date status
## 32   20        502      0
## 33   21        427      0
## 34   22         NA     NA
## 36   23        882      0
## 41   24        381      1
## 42   25        386      1
## 43   26         NA     NA
## 46   27        711      1
## 47   28        280      0
## 50   29        335      0

【讨论】:

以上是关于如何从最后一行重复观察中制作子集数据框?的主要内容,如果未能解决你的问题,请参考以下文章

从数据集列表制作多索引数据框[重复]

如何对您的数据框进行子集化以在 R 中保留前 3 个重复行?

在快速滚动collectionview时,第一行数据在最后一行重复

从R中的数据框中子集列[重复]

如何从数据框熊猫中制作列表列表?

如何从存储在 pyspark 链接中的数据制作数据框?