计算在数据帧中使用两行的序列匹配数

时间:2018-04-05 12:11:37

标签: r dataframe sequence

       Tijd nummer schaap                     code   Modifier comment status
1     2.971             1                stilstaan       <NA>      NA  START
2     5.457             1                   ruiken aan object      NA  POINT
3    10.703             1                stilstaan       <NA>      NA   STOP
4    10.704             1                    lopen       <NA>      NA  START
5    12.959             1                    lopen       <NA>      NA   STOP
6    12.960             1                stilstaan       <NA>      NA  START
7    22.732             1                   ruiken aan object      NA  POINT
8    29.383             1                stilstaan       <NA>      NA   STOP
9    29.384             1                    lopen       <NA>      NA  START
10   42.568             1                    lopen       <NA>      NA   STOP
11   42.569             1                   ruiken aan object      NA  POINT
12   49.206             1                    lopen       <NA>      NA  START
13   66.533             1                    lopen       <NA>      NA   STOP
14   66.534             1                stilstaan       <NA>      NA  START
15   67.134             1                   ruiken aan object      NA  POINT
16   72.999             1                stilstaan       <NA>      NA   STOP
17   73.000             1                    lopen       <NA>      NA  START
18   77.480             1                    lopen       <NA>      NA   STOP
19   77.481             1                stilstaan       <NA>      NA  START
20   81.773             1               rondkijken       <NA>      NA  START

我是一名从事实习的行为生物学学生,我一直用R来做我的统计数据,但我真的不知道如何做我现在想做的事情。这个数据框包含我的观察结果(荷兰语),我想计算多少次&#34; stilstaan​​&#34;之后是&#34; ruiken&#34;使用修饰符&#34; aan object&#34;。我一直无法找到办法完全按照自己的意愿行事。我可以计算次数&#34; stilstaan​​&#34;之后是&#34; ruiken&#34;使用下面的代码,但我不知道如何包含修饰符。有没有办法做到这一点,还是我要求不可能?

S=Excel_bestand_schapen
seq=c("stilstaan", "ruiken")
library(zoo)
result=rollapply(S, 2, identical, seq)
length(result[result == TRUE])    

3 个答案:

答案 0 :(得分:1)

我们可以使用以下代码来过滤符合要求的行。 lead可以向前移动整个向量。这个数据集的答案是三个。

library(dplyr)

dat2 <- dat %>%
  filter(code %in% "stilstaan" & lead(code) %in% "ruiken" & lead(Modifier) %in% "aan object") 

nrow(dat2)
# [1] 3

数据

dat <- read.table(text = "       Tijd 'nummer schaap'                     code   Modifier comment status
1     2.971             1                stilstaan       NA      NA  START
                  2     5.457             1                   ruiken 'aan object'      NA  POINT
                  3    10.703             1                stilstaan         NA      NA   STOP
                  4    10.704             1                    lopen         NA      NA  START
                  5    12.959             1                    lopen         NA      NA   STOP
                  6    12.960             1                stilstaan         NA      NA  START
                  7    22.732             1                   ruiken 'aan object'      NA  POINT
                  8    29.383             1                stilstaan         NA      NA   STOP
                  9    29.384             1                    lopen         NA      NA  START
                  10   42.568             1                    lopen         NA      NA   STOP
                  11   42.569             1                   ruiken 'aan object'      NA  POINT
                  12   49.206             1                    lopen         NA      NA  START
                  13   66.533             1                    lopen         NA      NA   STOP
                  14   66.534             1                stilstaan         NA      NA  START
                  15   67.134             1                   ruiken 'aan object'      NA  POINT
                  16   72.999             1                stilstaan         NA      NA   STOP
                  17   73.000             1                    lopen         NA      NA  START
                  18   77.480             1                    lopen         NA      NA   STOP
                  19   77.481             1                stilstaan         NA      NA  START
                  20   81.773             1               rondkijken         NA      NA  START",
                  header = TRUE, stringsAsFactors = FALSE)

答案 1 :(得分:0)

使用base R和www的dat-data-frame:

sum(ifelse((dat$code == "stilstaan") & 
             (c(dat$code[2:length(dat$code)], NA) == "ruiken") &
             (c(dat$Modifier[2:length(dat$Modifier)], NA) == "aan object"),
           1, 0))

答案 2 :(得分:0)

您可以将相关列折叠为单个字符串

collapse <- paste(paste(dat$code, dat$Modifier), collapse=" ")
# [1] "stilstaan NA ruiken aan object stilstaan NA lopen ...

定义您要搜索的模式

pattern <- "stilstaan NA ruiken aan object"

使用stringr::str_count来计算匹配数

stringr::str_count(pattern, collapse)
# 3