如何取出每个主题ID的前两行

时间:2014-10-28 05:51:18

标签: r dataframe

我的数据如下所示。我希望通过获取每个主题ID的前两行来分组数据并丢弃其余的。我怎么能为所有人做到这一点?

ID TIME CONC
1   0    1
1   5    5
1   7    11
2   0    0.5
2   1    10
2   2    15

提前致谢!

1 个答案:

答案 0 :(得分:0)

你可以这样做:

library(dplyr)
library(tidyr)
 df %>%
     group_by(ID)%>% 
     slice(1:2)

 #   ID TIME CONC
 #1  1    0  1.0
 #2  1    5  5.0
 #3  2    0  0.5
 #4  2    1 10.0

或使用data.table

library(data.table)
setDT(df)[, .SD[1:2], by=ID]
#   ID TIME CONC
#1:  1    0  1.0
#2:  1    5  5.0
#3:  2    0  0.5
#4:  2    1 10.0

或者

setDT(df)[df[, .I[1:2], by=ID]$V1,]

或使用base R

df[with(df, ave(seq_along(ID), ID, FUN=seq_along) <3),] #from @John's comments

在这种情况下,您可以将上述代码缩短为(考虑到ID不是factor变量。

df[with(df, ave(ID, ID, FUN=seq_along) <3),]

数据

df <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L), TIME = c(0L, 5L, 
7L, 0L, 1L, 2L), CONC = c(1, 5, 11, 0.5, 10, 15)), .Names = c("ID", 
"TIME", "CONC"), class = "data.frame", row.names = c(NA, -6L))