基于首次出现状态标志的子集数据

时间:2018-09-25 05:02:32

标签: r

我的数据如下:

dfin <- 
ID   TIME   CONC   STATUS
 1    0      5      0
 1    1      4      1
 1    2      3      0
 2    0      2      0 
 2    10     2      0
 2    15     1      0

我想为dfinID时第一次出现的STATUS==1(每个TIME > 0)子集。如果主题ID在任何时候都没有记录STATUS==1,那么我需要对该主题的最后一个原始数据进行子集化。

此处的输出应为:

dfout <- 
ID   TIME   CONC   STATUS
 1    1      4      1
 2    15     1      0

2 个答案:

答案 0 :(得分:3)

使用def create_skill(request): if request.method == 'POST': name = request.POST['name'] type = request.POST['type'] skill = Skill(skill_name=name,skill_type=type) skill.save() return HttpResponse() 的一种方法,我们可以dplyr group_by并检查是否存在满足我们条件(ID)的行,如果满足,则得到使用STATUS == 1 & TIME > 0满足条件的第一行,如果没有这样的行,则只使用which.max返回最后一行。

n()

另一种仅使用基数R的方法。这实际上遵循与library(dplyr) df %>% group_by(ID) %>% slice(ifelse(any(STATUS == 1 & TIME > 0), which.max(STATUS == 1 & TIME > 0), n())) # ID TIME CONC STATUS # <int> <int> <int> <int> #1 1 1 4 1 #2 2 15 1 0 中相同的逻辑,但是dplyr返回的长度与输入相同,因此我们仅保留ave的值并取累加和({ {1}})从数据框中获取相应的行。

unique

答案 1 :(得分:1)

这是使用data.table的一种方法。将data.frame转换为'data.table'(setDT(dfin)),按'ID'分组,if的{​​{1}}'STATUS'为1,然后获得逻辑表达式,其中' TIME'大于0或any得到最后一行(else)和带有.N的子集

.SD

也可以写为

library(data.table)
setDT(dfin)[,  .SD[if(any(STATUS == 1)) STATUS == 1& TIME  > 0 else .N], ID]
#   ID TIME CONC STATUS
#1:  1    1    4      1
#2:  2   15    1      0

数据

setDT(dfin)[, .SD[(STATUS == 1 & TIME > 0)| (!any(STATUS) & seq_len(.N) == .N)], ID]