R 查找数据帧中连续零后的第一个数字
我有一个如下的数据框R 查找数据帧中连续零后的第一个数字,r,dataframe,filter,dplyr,extract,R,Dataframe,Filter,Dplyr,Extract,我有一个如下的数据框 data <- tibble(ID=rep(c(1:2), each= 9), time = rep(1:9, 2), event = c(1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,1,0)) 我想检索每个主题的第一行,该行在连续零后有1个,即第一个主题的data.frame中的第8行和第二个主题的data.frame中的第15行。我们可以使用rle选择每个组ID中第一个连续零后的第一行 如果我正确理解您的问题,请给出简洁的回答: librar
data <- tibble(ID=rep(c(1:2), each= 9), time = rep(1:9, 2), event = c(1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,1,0))
我想检索每个主题的第一行,该行在连续零后有1个,即第一个主题的data.frame中的第8行和第二个主题的data.frame中的第15行。我们可以使用rle选择每个组ID中第一个连续零后的第一行
如果我正确理解您的问题,请给出简洁的回答:
library(dplyr)
data %>%
filter(event==1,lag(event)==0)
我的答案与Eric的非常相似,但需要2个零而不是1 -编辑以将结果限制为仅第一次出现,而不是全部出现
library(dplyr)
data <- tibble(ID=rep(c(1:2), each= 9), time = rep(1:9, 2), event = c(1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,1,0))
data %>%
group_by(ID) %>%
filter(
event == 1,
dplyr::lag(event) == 0,
dplyr::lag(event, 2) == 0,
cumsum(event == 1 & # this limits the results to the first occurrence
dplyr::lag(event, default = 1) == 0 &
dplyr::lag(event, default = 1, n = 2) == 0) == 1
)
1 oneAfter0获取0和1的向量并将它们粘贴在一起。然后,它使用regexpr查找01的第一个匹配项,并返回与输入长度相同的逻辑向量t。对于第一个1的位置,该结果为真,其他位置为假
ave用于将其应用于每个组,subset用于将对应于TRUE的行子集化
没有使用任何软件包
oneAfter0 <- function(x) regexpr("01", paste(x, collapse = "")) + 1 == seq_along(x)
subset(data, ave(event, ID, FUN = oneAfter0) == 1)
这是一个有目的的说教版本,旨在展示如何使用rle的运行长度来捕获行索引,以用于识别零运行和以下非零事件 图书馆弹琴 > >正在附加包:“dplyr” >以下对象已从“package:stats”屏蔽: > >滤波器,滞后 >以下对象已从“package:base”屏蔽: > >相交、setdiff、setequal、并集 数据2 1 > 3 2 6 1 > 4 2 8 1 由v0.3.0于2019年12月16日创建,以下是带有rle的基本R解决方案:
到目前为止您尝试了什么?这将为每个组提供所有出现的0后跟1,而不仅仅是第一个。
oneAfter0 <- function(x) regexpr("01", paste(x, collapse = "")) + 1 == seq_along(x)
subset(data, ave(event, ID, FUN = oneAfter0) == 1)
library(dplyr)
data %>%
group_by(ID) %>%
filter(regexpr("01", paste(event, collapse = "")) + 1 == 1:n()) %>%
ungroup
r <- rle(data$event)
df <- data[cumsum(r$lengths)[r$lengths > 1 & r$values==0]+1,]
> df
ID time event
8 1 8 1
15 2 6 1