我有一个像这样的数据框:
ID TIME AMT CONC
1 0 10 2
1 1 0 1
1 5 20 15
1 10 0 30
1 12 0 16
从AMT> 0的最后一次到该个人数据帧的最后一行,我想为每个主题ID的数据进行子集化。
输出应为:
ID TIME AMT CONC
1 5 20 15
1 10 0 30
1 12 0 16
我正在使用RStudio。
答案 0 :(得分:3)
我们可以使用slice
并在AMT > 0
的最大索引和每个ID
的最后一个索引之间创建一个序列。
library(dplyr)
df %>%
group_by(ID) %>%
slice(max(which(AMT > 0)) : n())
# ID TIME AMT CONC
# <int> <int> <int> <int>
#1 1 5 20 15
#2 1 10 0 30
#3 1 12 0 16
答案 1 :(得分:2)
我们可以使用filter
library(dplyr)
df %>%
group_by(ID) %>%
mutate(ind = cumsum(AMT > 0)) %>%
filter(ind == max(ind), ind > 0) %>%
select(-ind)
# A tibble: 3 x 4
# Groups: ID [1]
# ID TIME AMT CONC
# <int> <int> <int> <int>
#1 1 5 20 15
#2 1 10 0 30
#3 1 12 0 16
注意:当特定组的“ AMT”的所有元素均为0时,这也很好用
df$ID[4:5] <- 2
df$AMT <- 0
df$AMT[4:5] <- c(1, 0)
或者另一个选择是减少步骤
df %>%
group_by(ID) %>%
filter(row_number() >= which.max(cumsum(AMT > 0)))
df <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L), TIME = c(0L, 1L, 5L,
10L, 12L), AMT = c(10L, 0L, 20L, 0L, 0L), CONC = c(2L, 1L, 15L,
30L, 16L)), class = "data.frame", row.names = c(NA, -5L))