从最后一次满足条件到数据帧最后一行的子集数据-应用于每个主题

时间:2019-07-02 01:59:06

标签: r dplyr subset

我有一个像这样的数据框:

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。

2 个答案:

答案 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))