R - связать выходной файл со списком фреймов данных путем сопоставления имен - PullRequest
2 голосов
/ 29 мая 2020

Цель

Моя основная цель - добавить среднюю строку в, каким-то образом связав среднее значение из среднего списка в список фреймов данных, который я создал для создания фреймов данных большего размера в списке фреймов данных. Я много писал по этому вопросу, поэтому надеюсь, что вы можете мне помочь в моем случае. Если что-то неясно, прокомментируйте!

Код

Предположим, у вас есть три разных фрейма данных, которые вы хотите создать ниже:

df1 <- data.frame(aa = sample(1:10, 5, replace = TRUE),
                  bb = sample(1:10, 5, replace = TRUE),
                  cc = sample(1:10, 5, replace = TRUE),
                  row.names = c("a", "b", "c", "d", "e"))


df2 <- data.frame(aa = sample(1:10, 5, replace = TRUE),
                  bb = sample(1:10, 5, replace = TRUE),
                  cc = sample(1:10, 5, replace = TRUE),
                  row.names = c("a", "b", "c", "d", "e"))

df3 <- data.frame(aa = sample(1:10, 5, replace = TRUE),
                  bb = sample(1:10, 5, replace = TRUE),
                  cc = sample(1:10, 5, replace = TRUE),
                  row.names = c("a", "b", "c", "d", "e"))

Это даст следующие результаты в консоли для этого примера:

> df1 #the arrow on the left specifies the console entry
  aa bb cc
a  6  9  5
b  2  6  4
c  6  2  3
d 10  4  8
e  3  1  3
> df2
  aa bb cc
a  7  9 10
b  2  7  5
c  1  5  7
d  8  5  5
e  9  3  5
> df3
  aa bb cc
a  2  6  8
b  3  7  7
c  1  4  2
d  4  9  9
e  8  7  3

Теперь я хочу поместить их в список, чтобы сэкономить объем работы, который мне нужно сделать (надеюсь!):

df_list <- list(df1=df1, df2=df2, df3=df3) 
#Kept the names for future reference (so that I could write df_list$df1 instead of df_list[[1]]

Давать у меня респектабельный список, идентичный выходам df1-3, просто все вместе:

> df_list
$df1
  aa bb cc
a  6  9  5
b  2  6  4
c  6  2  3
d 10  4  8
e  3  1  3

$df2
  aa bb cc
a  7  9 10
...

Теперь я хотел создать в основном выполнение colMean по моим данным, но я не нашел более эффективного способа сделайте это, кроме использования lapply с mean:

mean_lst <- lapply(df_list, function(x) {lapply(x[,1:ncol(x)], mean)}) #finding means of columns

Приведенный выше код вложен странным образом, но он дал результат, который я искал (если есть лучший способ достижения почти идентичны, не стесняйтесь комментировать это). Это дало мне интересный результат, который выглядит полезным ...? Я новичок в R, поэтому не уверен, как это правильно использовать. Взгляните на вывод mean_lst:

> mean_lst
$df1
$df1$aa
[1] 5.4

$df1$bb
[1] 4.4

...

$df3$cc
[1] 5.8

The Struggle (is.Real) и вопрос

Я пробовал rbind безрезультатно и не совсем понимаю, как я могу использовать этот вывод (или любой другой вывод), чтобы я мог вычислить средства каждого фрейма данных, не выполняя их один за другим, без необходимости извлекать фреймы данных из списка и писать идентичный код. Результат моей мечты будет выглядеть примерно так, если применить вывод mean_lst к каждому фрейму данных в df_list с помощью rbind:

> df_list$df1
      aa  bb  cc
   a   6   9   5
   b   2   6   4
   c   6   2   3
   d  10   4   8
   e   3   1   3
mean 5.4 4.4 4.6

Кто-нибудь знает, как написать такой код, если он существует? Или есть более эффективный способ записи colMeans для каждого из этих столбцов в фреймах данных в списках без необходимости явно записывать имена фреймов данных? Заранее большое спасибо!

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Мы можем l oop поверх list с lapply и rbind с colMeans данных

df_list <- lapply(df_list, function(x) rbind(x, mean = colMeans(x)))

df_list
#$df1
#      aa  bb   cc
#a    8.0 2.0  9.0
#b    5.0 8.0  3.0
#c    8.0 9.0  3.0
#d    7.0 4.0  7.0
#e    5.0 5.0 10.0
#mean 6.6 5.6  6.4

#$df2
#      aa bb cc
#a    4.0  3  9
#b    8.0  9  6
#c    2.0  6  4
#d    1.0  5  8
#e    7.0  2  8
#mean 4.4  5  7

#$df3
#      aa  bb cc
#a    9.0 5.0  1
#b    4.0 5.0  9
#c    8.0 9.0  7
#d    9.0 5.0  9
#e    1.0 3.0  9
#mean 6.2 5.4  7

Или с Map/lapply

Map(rbind, df_list, mean =lapply(df_list, colMeans))

Или с purrr

library(purrr)
library(tibble)
library(dplyr)
df_list <- map(df_list, ~  colMeans(.x) %>%
                                     bind_rows(.x, .))

Или используя summarise/across

df_list %>%
    map(~ .x %>% 
            summarise(across(where(is.numeric), mean)) %>% 
              `row.names<-`(., 'mean') %>% 
           bind_rows(.x, .))
2 голосов
/ 29 мая 2020

Вместо использования lapply для вычисления среднего значения столбца, вы можете использовать colMeans для расчета среднего значения столбца для всего фрейма данных и rbind для исходных данных.

df_list <- lapply(df_list, function(x) rbind(x, mean = colMeans(x, na.rm = TRUE)))
df_list

#$df1
#      aa  bb   cc
#a    1.0 3.0  2.0
#b    4.0 2.0  9.0
#c    5.0 9.0 10.0
#d    1.0 1.0  4.0
#e    1.0 9.0  2.0
#mean 2.4 4.8  5.4

#$df2
#       aa bb  cc
#a    10.0  3 7.0
#b     4.0  6 6.0
#c     7.0  7 1.0
#d     4.0  3 9.0
#e     9.0  6 3.0
#mean  6.8  5 5.2

#$df3
#      aa  bb   cc
#a    5.0 5.0 10.0
#b    6.0 3.0  4.0
#c    7.0 6.0  8.0
#d    5.0 6.0 10.0
#e    4.0 2.0  2.0
#mean 5.4 4.4  6.8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...