我的数据如下所示。我希望通过获取每个主题ID的前两行来分组数据并丢弃其余的。我怎么能为所有人做到这一点?
ID TIME CONC
1 0 1
1 5 5
1 7 11
2 0 0.5
2 1 10
2 2 15
提前致谢!
答案 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))