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

У меня есть список фреймов данных, и я хочу вычислить среднее значение для каждой первой строки для всех вторых строк и т. Д. c.

Я думаю, что это возможно, если создать некоторый общий фактор в качестве индекса, соединить кадры данных, используя rbind, а затем вычислить среднее значение, используя aggregate(value ~ row.index, mean, large.df). Тем не менее, я думаю, что есть более простой способ?

Вот мой пример:

df1 = data.frame(val = c(4,1,0))
df2 = data.frame(val = c(5,2,1))
df3 = data.frame(val = c(6,3,2))

myLs=list(df1, df2, df3)

[[1]]
  val
1   4
2   1
3   0

[[2]]
  val
1   5
2   2
3   1

[[3]]
  val
1   6
2   3
3   2

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

df.means
  mean
1   5
2   2
3   1

My первые шаги, пока не работают должным образом:

# Calculate the mean of list by rows
lapply(myLs, function(x) mean(x[1,]))

Ответы [ 4 ]

3 голосов
/ 30 января 2020

Простым способом было бы cbind список и вычисление среднего значения для каждой строки с помощью rowMeans

rowMeans(do.call(cbind, myLs))
#[1] 5 2 1

Мы также можем использовать bind_cols из dplyr для объединения всех фреймов данных.

rowMeans(dplyr::bind_cols(myLs))
0 голосов
/ 30 января 2020

Другая base R возможность может быть:

Reduce("+", myLs)/length(myLs)

  val
1   5
2   2
3   1
0 голосов
/ 30 января 2020

Использование двойного l oop:

sapply(1:3, function(i) mean(sapply(myLs, function(j) j[i, ] )))
# [1] 5 2 1
0 голосов
/ 30 января 2020

Вот еще одно базовое решение R с использованием unlist + data.frame + rowMeans, то есть

rowMeans(data.frame(unlist(myLs,recursive = F)))
# [1] 5 2 1
...