Среднее значение переменной из нескольких данных.кадр в R?

#r #dataframe #tidyverse #mean #lubridate

#r #фрейм данных #tidyverse #означать #лубридат

Вопрос:

У меня есть следующее data.frame , и я хотел бы создать другое data.frame (скажем, M), которое хранило mean A1 бы от M1,M2,M3 , mean от B1 , от M1,M2,M3 и аналогично для C1 .

 library(tidyverse)   set.seed(123)  M1 lt;- data.frame(Date = seq(as.Date("2001-01-01"), to = as.Date("2005-12-31"), by = "month"),  A1 = runif(60,1,5),  B1 = runif(60,1,5),  C1 = runif(60,1,5))  M2 lt;- data.frame(Date = seq(as.Date("2001-01-01"), to = as.Date("2005-12-31"), by = "month"),  A1 = runif(60,1,5),  B1 = runif(60,1,5),  C1 = runif(60,1,5))  M3 lt;- data.frame(Date = seq(as.Date("2001-01-01"), to = as.Date("2005-12-31"), by = "month"),  A1 = runif(60,1,5),  B1 = runif(60,1,5),  C1 = runif(60,1,5))  

Желаемый результат

Результатом будет a data.frame (M) с переменными A (mean of A1 from M1,M2,M3) , B (mean of B1 from M1,M2,M3) , и C (mean of C1 from M1,M2,M3) .

Ответ №1:

Мы получаем наборы данных в list ( mget ), подмножествуем интересующие столбцы, получаем сумму по элементам ( ) и делим на 3 (так как есть только 3 набора данных)

 M lt;- Reduce(` `, lapply(mget(ls(pattern = "^M\d ")), `[`,   -1))/3 names(M) lt;- sub("\d ", "", names(M))  

-выход

 gt; head(M)  A B C 1 2.694883 3.345868 3.196847 2 2.724759 2.868531 2.524246 3 3.685341 2.535909 2.859400 4 2.941540 2.639169 3.182535 5 3.530815 3.690165 3.576402 6 2.747724 3.399104 3.107880  

Или другой вариант-связать наборы данных вместе, а затем создать группу по mean

 library(dplyr) library(stringr) bind_rows(M1, M2, M3) %gt;%  group_by(Date) %gt;%  summarise(across(everything(), mean, na.rm = TRUE,   .names = "{str_remove(.col, '[0-9] ')}")) # A tibble: 60 × 4  Date A B C  lt;dategt; lt;dblgt; lt;dblgt; lt;dblgt;  1 2001-01-01 2.69 3.35 3.20  2 2001-02-01 2.72 2.87 2.52  3 2001-03-01 3.69 2.54 2.86  4 2001-04-01 2.94 2.64 3.18  5 2001-05-01 3.53 3.69 3.58  6 2001-06-01 2.75 3.40 3.11  7 2001-07-01 2.32 3.02 1.58  8 2001-08-01 2.97 3.89 2.04  9 2001-09-01 3.49 3.56 2.36 10 2001-10-01 3.46 3.71 3.69 # … with 50 more rows  

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

1. Спасибо Акрун — мне нравится аккуратное решение.