Получить среднее значение для всех столбцов фрейма данных R

#r #dataframe #sum #multiple-columns #mean

#r #фрейм данных #сумма #несколько столбцов #среднее

Вопрос:

У меня есть фрейм данных, который состоит из нескольких столбцов. Каждый столбец представляет день в году (у меня 365 столбцов), а каждая строка — это средняя температура определенного города. Я хотел бы получить среднее значение для всех столбцов, поэтому я получаю среднее значение температуры за весь год. Я также хотел бы получить среднее значение каждого месяца (то есть среднее значение 01 (январь), 02 (февраль) и т. Д.), А также получить среднее значение за квартал года.

Мои данные выглядят примерно так

 data <- data.frame(City = c("London", "Stockholm", "Paris", "Prag", "Berlin", "Copenhagen"), 
                   20100101 = c(4, 5, 3, 4, 6, 7), 20100102 = c(2, 5, 8, 6, 1, 3), 
                   20100205 = c(4, 7, 6, 1, 3, 4), 20100305 = c(0, 3, 7, 9, 3, 2), 
                   20100525 = c(9, 8, 7, 6, 5, 4), 20100719 = c(9, 10, 5, 6, 7, 8), 
                   20101011 = c(15, 3, 5, 7, 8, 9), 20101112 = c(3, 7, 1, 1, 1, 1), 
                   20101212 = c(0, 0, 0, 5, 2, 1))
  

Как я могу извлечь среднее значение за год, каждый месяц и каждый квартал года?

Ответ №1:

Было бы намного проще справиться с этим, если вы получаете данные в длинном формате.

 library(dplyr)

long_data <- data %>% 
             tidyr::pivot_longer(cols = -City) %>% 
             mutate(name = as.Date(name, '%Y%m%d'))
  

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

 long_data %>%
  group_by(City) %>%
  summarise(year_mean = mean(value,na.rm = TRUE))
  

Среднее значение за месяц :

 long_data %>%
  group_by(City, month = lubridate::month(name)) %>%
  #For quarter
  #group_by(City, quarter = quarter(name)) %>%
  summarise(month_mean = mean(value,na.rm = TRUE))
  

Комментарии:

1. Спасибо, Ронак! У меня просто небольшая проблема с первым кодом. Когда я превращаю его в длинную таблицу и добавляю строку с помощью mutate, я получаю (в общей сложности) три столбца. Один столбец с названием города, и он заполнен тем же городом, один столбец с именем «name», и он заполнен NA (?), а последний — «value», который заполнен предыдущими значениями. Почему я получил NA i столбец «name»? Может ли это быть, поскольку мои столбцы фактически выглядят так? 2015_02_15 вместо 20150215?

2. @paula456 В этом случае измените mutate строку на mutate(name = as.Date(name, '%Y_%m_%d')) . Вы также можете использовать lubridate ‘s ymd здесь, как mutate(name = lubridate::ymd(name))

3. Я понял, в чем проблема. Я превращал объект sf в объект sp, и все мои данные в столбце «годы» получили X перед всеми значениями. Я просто добавил «X%Y_% m_% d», и это сработало 🙂 БОЛЬШОЕ СПАСИБО!!

Ответ №2:

Мы могли бы сделать это base R с rowMeans помощью и split.default

 # // convert the date columns to `Date` class
dates <- as.Date(names(data)[-1], "%Y%m%d")
# // get the row wise mean of numeric columns (except the first column)
city_means <- rowMeans(data[-1])
names(city_means) <- data$City
 
# // split the data into list of data.frame based on the month
# // loop over the list with sapply and get the rowMeans
month_means <- sapply(split.default(data[-1], format(dates, "%b")),
      rowMeans, na.rm = TRUE)
row.names(month_means) <- data$City

# // split by year quarters and get the rowMeans for each list element
quarter_means <- sapply(split.default(data[-1], paste(format(dates, "%Y"), 
               quarters(dates))), rowMeans, na.rm = TRUE)
row.names(quarter_means) <- data$City
  

данные

 data <- structure(list(City = c("London", "Stockholm", "Paris", "Prag", 
"Berlin", "Copenhagen"), `20100101` = c(4, 5, 3, 4, 6, 7), `20100102` = c(2, 
5, 8, 6, 1, 3), `20100205` = c(4, 7, 6, 1, 3, 4), `20100305` = c(0, 
3, 7, 9, 3, 2), `20100525` = c(9, 8, 7, 6, 5, 4), `20100719` = c(9, 
10, 5, 6, 7, 8), `20101011` = c(15, 3, 5, 7, 8, 9), `20101112` = c(3, 
7, 1, 1, 1, 1), `20101212` = c(0, 0, 0, 5, 2, 1)), 
class = "data.frame", row.names = c(NA, 
-6L))