簡體   English   中英

R 分組觀察的數量等於模式(按組)隨着時間的推移

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM