Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 查找数据帧中连续零后的第一个数字_R_Dataframe_Filter_Dplyr_Extract - Fatal编程技术网

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