[英]R number of grouped observations equal to the mode (by group) over time
我正在研究分組數據中的值 X 如何隨時間 (t) 發生變化。 對於大多數觀察,X 從零開始,然后隨着時間的推移隨機變化。 在每個時間點,我想找出各組許多obeservations怎么也該組的模式值-理想不包括零個值。 數據如下所示,但具有更多、更大的組和更多的 t 列。
group_name t1 t10 t50 t100
1 s3 0 259 187 122
2 s1 29 25 23 15
3 s3 0 259 23 122
4 s2 0 36 24 15
5 s1 29 25 23 15
6 s2 0 32 24 15
最終,我想繪制有多少觀察值具有作為 t 函數的各自組的眾數值,但我不知道如何使用高效的 R 代碼處理數據。
我已經看到有幾種方法可以在單個時間點(例如此處)計算每個組的模式,但我不知道如何調整這些方法以計算等於該模式的數量,或者哪種方法最多放大多個 t 列的有效方法。
感謝您的任何建議!
我們可以按“group_name”分組,並通過排除 0 值 ( .[. != 0]
) 對行的子集應用Mode
函數,並across
其余列 ( everything()
) 中summarise
,創建一個邏輯向量( ==
) 與列的元素並獲得sum
以通過分組變量找到每列的頻率
library(dplyr)
df1 %>%
group_by(group_name) %>%
summarise(across(everything(), ~ sum(Mode(.[. !=0]) == ., na.rm = TRUE)))
# A tibble: 3 x 5
# group_name t1 t10 t50 t100
# <chr> <int> <int> <int> <int>
#1 s1 2 2 2 2
#2 s2 0 1 2 2
#3 s3 0 2 1 2
或者使用data.table
library(data.table)
setDT(df1)[, lapply(.SD, function(x) sum(Mode(x[x != 0]) == x, na.rm = TRUE)),
by = group_name]
在哪里
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
如果我們需要跨 't' 列進行計算,請重新pivot_longer
為 'long' 格式( pivot_longer
), filter
掉 0 值,按 'group_name' 分組,用 'Mode' 值的頻率summarise
library(tidyr)
df1 %>%
pivot_longer(cols = starts_with('t')) %>%
filter(value != 0) %>%
group_by(group_name) %>%
summarise(n_Mode = sum(Mode(value) == value))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.