Рассчитать Z-показатель для каждых N строк в DF (R) - PullRequest
0 голосов
/ 10 апреля 2020

Привет. У меня есть df с переменными, поскольку столбцы и строки - это время. Элементом каждого пересечения является счетчик.

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

Этот файл содержит много строк (> 30 000)

Как рассчитать Z баллов для каждых 20 строк? Заранее спасибо! <3 </p>

1 Ответ

0 голосов
/ 10 апреля 2020

Вот ответ, который использует dplyr::summarise() для расчета средних и стандартных отклонений, затем мы объединяем их с исходными данными и используем mutate() для вычисления z-показателей. Мы проиллюстрируем случай с одной переменной, но он может быть расширен для обработки нескольких переменных.

Учитывая неоднозначность исходного вопроса, мы предполагаем, что столбец Time- структурирован в группы по 20, что позволяет использовать его в качестве основной группирующей переменной для решения. То есть 20 наблюдений в Time-1, еще 20 наблюдений в Time-2 и др. 1027 *.

Если требуется создать группы из 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)

... и выходные данные:

> 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)

... и вывод:

> 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
> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...