如果 R 中有两 (1) 行,则每 6 行标记一次

flagging every 6 rows in R if there are two (1) within them

我在 R 中有一个数据框(时间序列(每 10 分钟观察一次),有 3000 行。在一列中我有 0 和 1 用于质量控制,我必须检查此列以查看是否每 6 行(1 小时)我有两个或两个以上 (1) 或没有?如果是,我应该将该组标记为 (Na)。我该怎么做?

看来您是 SO 的新手。 This 是一本很好且重要的读物,它将确保您吸引人们来研究您的问题。

这是我如何理解您的问题的解决方案。 以 10 分钟为步长创建超过一年的时间序列。

向量 check 已在 interval 的长度上采样 01。为了可重复性,我设置了一个种子。

DF由两者组成。 此 DF 按月、日和小时分组,并创建一个值,该值对 1 的每小时求和。如果这个数字是 2 或更大,一个新变量 flag 得到一个 NA ,如果不是它得到一个空字符串。

最后只选择相关变量。

library(tidyverse)
library(lubridate)

set.seed(1)
interval <- seq(ymd_hms('2020-12-01 00:00:00'), 
                by = '10 min',length.out=(60*24*365/10))

check <- sample(c(0,1), length(interval), replace = T)
df <- data.frame(interval, check)

df %>% 
  mutate(hour = hour(interval)) %>% 
  group_by(month(interval),day(interval), hour(interval)) %>% 
  mutate(N = sum(check)) %>% 
  mutate(flag = ifelse(N >= 2, NA, '')) %>% 
  ungroup() %>% 
  dplyr::select(interval, check,N, flag) 
#> # A tibble: 52,560 x 4
#>    interval            check     N flag 
#>    <dttm>              <dbl> <dbl> <chr>
#>  1 2020-12-01 00:00:00     0     2 <NA> 
#>  2 2020-12-01 00:10:00     1     2 <NA> 
#>  3 2020-12-01 00:20:00     0     2 <NA> 
#>  4 2020-12-01 00:30:00     0     2 <NA> 
#>  5 2020-12-01 00:40:00     1     2 <NA> 
#>  6 2020-12-01 00:50:00     0     2 <NA> 
#>  7 2020-12-01 01:00:00     0     2 <NA> 
#>  8 2020-12-01 01:10:00     0     2 <NA> 
#>  9 2020-12-01 01:20:00     1     2 <NA> 
#> 10 2020-12-01 01:30:00     1     2 <NA> 
#> # … with 52,550 more rows

我用 TRUEFALSE 创建了 flag 变量,其中 TRUE 是当一个组的 check 中 1 的计数大于等于 2,否则 FALSE

library(dplyr)
df %>%
  group_by(group = ceiling(row_number()/6)) %>%
  mutate(flag = sum(check) >= 2) -> df

在基础 R 中相同:

df$flag <- with(df, ave(check, ceiling(seq_len(nrow(df))/6), FUN = sum) >= 2)

如果你真的想让 flag 成为 NA 而不是 TRUE 你可以使用 :

df %>%
  group_by(group = ceiling(row_number()/6)) %>%
  mutate(flag = if(sum(check) >= 2) NA else '') -> df