问题描述
我在 R 中有一个数据框(时间序列(每 10 分钟观察一次),有 3000 行。在一列中我有 0 和 1 用于质量控制,我必须检查此列以查看是否每 6 行(其中制作 1 小时)我有两个或两个以上 (1) 吗?如果有,我应该将该组标记为 (Na) 。我该怎么做?
解决方法
看来您是 SO 新手。 This 是一本很好且重要的读物,它将确保您吸引人们来解决您的问题。
这是我如何理解您的问题的解决方案。 以 10 分钟为步长创建超过一年的时间序列。
向量 check
在 0
的长度上采样了 1
或 interval
。为了可重复性,我已经设置了种子。
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
,
我用 flag
和 TRUE
创建了 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)
如果您真的希望 flag
为 NA
而不是 TRUE
,您可以使用:
df %>%
group_by(group = ceiling(row_number()/6)) %>%
mutate(flag = if(sum(check) >= 2) NA else '') -> df