如何解决如果其中有两 (1) 行,则在 R 中每 6 行标记一次
我在 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。