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

问题描述

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

解决方法

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

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

向量 check0 的长度上采样了 1interval。为了可重复性,我已经设置了种子。

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
,

我用 flagTRUE 创建了 FALSE 变量,其中 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)

如果您真的希望 flagNA 而不是 TRUE,您可以使用:

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