Рассчитать месячные суммы для нескольких столбцов - PullRequest
1 голос
/ 01 октября 2019

У меня есть фрейм данных, содержащий годы в первом столбце, месяцы во втором, дни в третьем, а затем данные о количестве осадков для разных городов (LON и NYC) в четвертом и пятом столбцах, как показано ниже:

mat1 = matrix(c(rep(1979, each=360), rep(1:12, each=30), rep(seq(1, 30, by=1), times=12), 
            rep(seq(5, 25, by=5), times=72), rep(seq(1, 9, by=1), times=40)), nrow=360, ncol=5)

colnames(mat1) = c("Year", "Month", "Day", "LON", "NYC")

Я хочу рассчитать месячные суммы для каждого города. Выходные данные должны иметь вид:

    LON NYC
Jan  x   x
Feb  x   x
Mar  x   x
................

Я пробовал:

aggregate(LON ~ Month + Year, mat1, sum)

, но это не выводит данные в нужном мне формате, и, что важно, это также позволяет мне только вычислятьдля одного города (столбца) одновременно. Как я могу адаптировать вышеперечисленное для работы для всех городов и вывода в нужном формате?

Ответы [ 3 ]

2 голосов
/ 01 октября 2019

Решение с использованием dplyr. Нам нужно преобразовать матрицу в фрейм данных перед использованием функций group_by и summarize_at.

library(dplyr)
mat1_sum <- mat1 %>%
  as.data.frame() %>%
  group_by(Month) %>%
  summarize_at(vars(LON, NYC), sum)
mat1_sum
# # A tibble: 12 x 3
#    Month   LON   NYC
#    <dbl> <dbl> <dbl>
#  1     1   450   141
#  2     2   450   150
#  3     3   450   159
#  4     4   450   141
#  5     5   450   150
#  6     6   450   159
#  7     7   450   141
#  8     8   450   150
#  9     9   450   159
# 10    10   450   141
# 11    11   450   150
# 12    12   450   159
2 голосов
/ 01 октября 2019

Возможно усложняющие вещи, но вариант dplyr - tidyr. При этом используются новые функции pivot_* вместо gather / spread. Опция dplyr, показанная @www, вероятно, более эффективна.

as.data.frame(mat1) %>% 
   pivot_longer(LON:NYC,names_to = "city")  %>% 
   group_by(Year,Month,city) %>% 
   summarise(Sum = sum(value)) %>% 
   pivot_wider(names_from = city,values_from = Sum)
# A tibble: 12 x 4
# Groups:   Year, Month [12]
    Year Month   LON   NYC
   <dbl> <dbl> <dbl> <dbl>
 1  1979     1   450   141
 2  1979     2   450   150
 3  1979     3   450   159
 4  1979     4   450   141
 5  1979     5   450   150
 6  1979     6   450   159
 7  1979     7   450   141
 8  1979     8   450   150
 9  1979     9   450   159
10  1979    10   450   141
11  1979    11   450   150
12  1979    12   450   159
1 голос
/ 01 октября 2019

Как это?

> aggregate(mat1[,4:5],list(mat1[,2]),sum)
   Group.1 LON NYC
1        1 450 141
2        2 450 150
3        3 450 159
4        4 450 141
5        5 450 150
6        6 450 159
7        7 450 141
8        8 450 150
9        9 450 159
10      10 450 141
11      11 450 150
12      12 450 159
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...