我的数据如下:
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
我想为dfin
和ID
时第一次出现的STATUS==1
(每个TIME > 0
)子集。如果主题ID
在任何时候都没有记录STATUS==1
,那么我需要对该主题的最后一个原始数据进行子集化。
此处的输出应为:
dfout <-
ID TIME CONC STATUS
1 1 4 1
2 15 1 0
答案 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]