如何从最后一行重复观察中制作子集数据框?
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 %>% group_by(name) %>% 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 %>% group_by(name) %>% 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 个重复行?