Рассчитать среднее значение по столбцу с интервалом в R - PullRequest
0 голосов
/ 25 февраля 2019

Мне не удалось найти дубликат моего вопроса, поэтому я надеюсь, что вы можете помочь.

Используя простой пример, я хочу вычислить среднее / среднее значение по столбцу на основе указанного размера окна (вызывая его n).

data <- data.frame(x = rep(1:10,1), y = rep(11:20, 1))

Я хочу добавить столбец z, который вычисляет среднее значение по 4 строкам за раз.

Таким образом, результат будет:

structure(list(x = 1:10, y = 11:20, z = c("NA", "NA", "NA", "12.5", 
"13.5", "14.5", "15.5", "16.5", "17.5", "18.5")), class = "data.frame", .Names = c("x", 
"y", "z"), row.names = c(NA, -10L))

Я вычислил средние строки по столбцу с интервалом в n строк следующим образом:

#For n = 4, row 4 is calculated as (11+12+13+14)/n
#For n =4, row 5 is calculated as (12+13+14+15)/n
#And so on ...

Я просматривал следующие сообщения, такие как:

  1. как рассчитать среднее значение по столбцу в R
  2. Рассчитать среднее по группе
  3. Как рассчитать среднее значение переменной по часам в R
  4. Рассчитать среднее значение для каждых 13 строк во фрейме данных
  5. Рассчитать среднее по критериям в R

Я попробовал этот код ниже, но я не могу получить решения для записи.

data<-data %>% mutate(z=rollapplyr(y,10,FUN=mean,by=4))

Благодарим Вас за помощь.Спасибо

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы можете использовать outer() с пользовательской функцией.diag() дает желаемые значения.

myMean <- function(x, y) mean(dat[seq(x, y), 2])
mmean <- diag(outer(1:nrow(dat), (4:nrow(dat)), Vectorize(myMean)))

dat$z <- NA  # initialize column
dat$z[-(1:3)] <- mmean

#     x  y    z
# 1   1 11   NA
# 2   2 12   NA
# 3   3 13   NA
# 4   4 14 12.5
# 5   5 15 13.5
# 6   6 16 14.5
# 7   7 17 15.5
# 8   8 18 16.5
# 9   9 19 17.5
# 10 10 20 18.5

Данные

dat <- data.frame(x=rep(1:10, 1), y=rep(11:20, 1))
0 голосов
/ 25 февраля 2019

Вы можете сделать это, используя скользящее среднее из библиотеки зоопарка

data <- data.frame(x = rep(1:10,1), y = rep(11:20, 1))

result <- structure(list(x = 1:10, y = 11:20, z = c("NA", "NA", "NA", "12.5", 
                                                    "13.5", "14.5", "15.5", "16.5", "17.5", "18.5")), class = "data.frame", .Names = c("x", 
                                                                                                                                       "y", "z"), row.names = c(NA, -10L))

## Ответ

library(zoo)
data$z <- rollmeanr(data$y,4,fill=NA)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...