#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. Спасибо Акрун — мне нравится аккуратное решение.