簡體   English   中英

計算 DF (R) 中每 N 行的 Z 分數

[英]Calculate Z-Score for every N rows in a DF (R)

嗨,我有一個具有變量的 df,因為列和行是時間。 每個交叉點的元素是一個計數。

      Var_1 Var_2 Var_3 
Time_1 5     4      5
Time_2 4     19     4 
Time_3 2     2     87

這個df有很多行(> 30,000)

如何計算每 20 行的 Z 分數? 提前致謝! <3

這是一個使用dplyr::summarise()計算均值和標准差的答案,然后我們將它們與原始數據合並並使用mutate()計算 z 分數。 我們將說明單個變量的情況,但它可以擴展為處理多個變量。

考慮到原始問題的模糊性,我們假設Time-列以 20 個為一組構成,這允許我們將其用作解決方案的主要分組變量。 也就是說,在Time-1有 20 個觀測值,在Time-2有另外 20 個觀測值,以此類推。

如果需要根據連續的行標識符創建 20 行的組,則可以輕松修改解決方案以添加分組變量來表示 20 行的集合。

# simulate some data
y <- rpois(20000,3) # simulate counts 
TimeVal <- paste0(rep("Time-",20000),
                  rep(1:1000,20))

data <-data.frame(TimeVal,y,stringsAsFactors = FALSE)
library(dplyr)
result <- data %>% group_by(TimeVal) %>% summarise(ybar = mean(y),
                                                        stDev = sd(y)) %>%
               full_join(data,.,) %>% mutate(.,zScore = (y - ybar) / stDev)
head(result)

...和 output:

> head(result)
  TimeVal y ybar    stDev      zScore
1  Time-1 6 3.45 1.276302  1.99795938
2  Time-2 2 2.95 1.700619 -0.55862010
3  Time-3 2 3.20 1.908430 -0.62878909
4  Time-4 3 3.10 1.916686 -0.05217339
5  Time-5 2 3.10 1.447321 -0.76002513
6  Time-6 2 3.30 1.809333 -0.71849700
> 

擴展解決方案:多列的 z 分數

為了解決原始輸入數據框中的多列問題,首先我們使用tidyr::pivot_longer)創建一個長格式的整潔數據框,計算均值和標准差,將它們與窄數據合並並計算 z 分數。

將輸入數據轉換為長格式的整潔數據框允許我們在dplyr::by_group()中使用原始列名,從而消除了計算原始中每一列的 z 分數所需的大量代碼數據。

library(tidyr)
set.seed(95014) # set seed to make results reproducible 
y2 <- rpois(20000,8)
y3 <- rpois(20000,15)    
data <- data.frame(TimeVal,y,y2,y3,stringsAsFactors = FALSE)

# convert to narrow format tidy, calculate means, sds, and zScores
longData <- data %>% 
  group_by(TimeVal) %>%
  pivot_longer(-TimeVal, 
      names_to = "variable",                                                         
      values_to = "value")  
result <- longData %>% 
  group_by(TimeVal,variable) %>% 
  summarise(avg = mean(value), stDev = sd(value)) %>%
  full_join(longData,.) %>% 
  mutate(.,zScore = (value - avg) / stDev)
head(result)

...和 output:

> head(result)
# A tibble: 6 x 6
# Groups:   TimeVal [2]
  TimeVal variable value   avg stDev zScore
  <chr>   <chr>    <int> <dbl> <dbl>  <dbl>
1 Time-1  y            6  3.45  1.28  2.00 
2 Time-1  y2          13  8.7   2.23  1.93 
3 Time-1  y3          20 16.4   5.25  0.686
4 Time-2  y            2  2.95  1.70 -0.559
5 Time-2  y2           6  8.2   2.89 -0.760
6 Time-2  y3          12 14.8   3.34 -0.852
> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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