[英]Summarize number of occurrences per minute in R
我有一些遙測數據記錄了接收器對聲學標簽的檢測。 數據幀包括唯一標簽代碼和檢測時間。 時間采用 Posix 時間(自 1970 年 1 月 1 日 00:00:00 UTC 以來的秒數)。
det <- data.frame(
code = c("34", "15", "34", "36", "15", "34", "36", "15", "34", "15", "15", "15", "34", "15", "34", "15", "34", "15", "34", "15", "34", "34", "15", "36"),
posix = c(1599655073, 1599655136, 1599655136, 1599655152, 1599655199, 1599655199, 1599655210, 1599655262, 1599655262, 1599655325, 1599655388, 1599655451, 1599655451, 1599655514, 1599655514, 1599655577, 1599655577, 1599655640, 1599655640, 1599655703, 1599655703, 1599655765, 1599655766, 1599655789)
)
我需要知道每分鍾檢測到標簽的次數。 output 應記錄從系列開始的連續分鍾、標簽代碼以及該分鍾內出現的次數。 如果一個代碼在一分鍾內沒有出現,它應該得到一個零。
output 的前六行應如下所示:
min code freq
1 1 34 1
2 1 15 0
3 1 36 0
4 2 34 1
5 2 15 1
6 2 36 1
提前致謝。
這對tidyr::complete
來說是個好任務:首先使用 lubridate package 轉換日期,然后用tidyr::complete
填補空白並創建freq
變量。
library(tidyr)
library(dplyr)
library(lubridate)
det %>%
mutate(posix = minute(as.POSIXlt(posix, origin = "1970-01-01")),
minute = posix - first(posix) + 1) %>%
complete(minute, code) %>%
group_by(minute, code) %>%
mutate(freq = sum(complete.cases(posix))) %>%
select(-posix)
# A tibble: 39 x 3
minute code freq
<dbl> <chr> <int>
1 1 15 0
2 1 34 1
3 1 36 0
4 2 15 1
5 2 34 1
6 2 36 0
7 3 15 1
8 3 34 1
9 3 36 1
10 4 15 0
# ... with 29 more rows
將minute
和code
轉換為因子並指定group_by(..., .drop = FALSE)
允許獲取minute
和code
的所有組合,即使在數據中找不到。 這些將被分配freq
0。
library(dplyr)
det |>
mutate(minute = 1 + ((posix - min(posix)) %/% 60)) |>
mutate(minute = factor(minute, levels = seq(1, max(minute)))) |>
mutate(code = factor(code)) |>
group_by(minute, code, .drop = FALSE) |>
summarize(freq = n(), .groups = "drop")
+ # A tibble: 36 × 3
minute code freq
<fct> <fct> <int>
1 1 15 0
2 1 34 1
3 1 36 0
4 2 15 1
5 2 34 1
6 2 36 1
7 3 15 1
8 3 34 1
9 3 36 1
10 4 15 1
# … with 26 more rows
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.