gpt4 book ai didi

r - 基于第一次出现状态标志的子集数据

转载 作者:行者123 更新时间:2023-12-01 00:16:03 25 4
gpt4 key购买 nike

我的数据如下所示:

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

最佳答案

一种方式 dplyr ,我们可以group_by ID并检查是否有任何行满足我们的条件( STATUS == 1 & TIME > 0 ),如果是,那么我们使用 which.max 获得满足条件的第一行, 如果没有这样的行,那么我们只使用 n() 返回最后一行.

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

另一种仅使用基础 R 的方法。这实际上遵循与 dplyr 相同的逻辑但是 ave返回长度与输入相同,所以我们只保留 unique值并对其进行累积总和 ( cumsum ) 以从数据框中获取相应的行。
df[cumsum(unique(with(df, ave(STATUS == 1 & TIME > 0, ID, FUN = function(x) 
if(any(x)) which.max(x) else length(x))))), ]

# ID TIME CONC STATUS
#2 1 1 4 1
#5 2 10 2 0

关于r - 基于第一次出现状态标志的子集数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52490888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com