首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有相同维度的3个数据帧的平均值

具有相同维度的3个数据帧的平均值
EN

Stack Overflow用户
提问于 2020-01-07 12:24:51
回答 3查看 83关注 0票数 2

我有3个维度相似的数据帧,结构如下:

代码语言:javascript
运行
复制
> str(Results_first_experiment)

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   30 obs. of  8 variables:
 $ Strain: chr  "1" "2" "3" "4" ...
 $ 0.5   : num  3452 4126 2200 3125 1392 ...
 $ 1     : num  11918 14445 7899 11735 5813 ...
 $ 2     : num  19848 20872 16089 19759 13746 ...
 $ 3     : num  20188 19937 20509 21012 19792 ...
 $ 4     : num  16586 17074 15426 14748 15470 ...
 $ 5     : num  16850 17288 17801 14051 17305 ...
 $ 6     : num  12816 14682 16325 15948 16069 ...  

> head (Results_first_experiment)
# A tibble: 6 x 8
  Strain `0.5`    `1`    `2`    `3`    `4`    `5`    `6`
  <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 1      3452. 11918. 19848. 20188. 16586. 16850. 12816 
2 2      4126  14445. 20872. 19937. 17074. 17288  14682.
3 3      2200.  7899. 16089. 20509  15426. 17801  16325.
4 4      3125. 11735. 19758. 21012. 14748  14051. 15948.
5 5      1392.  5813. 13746  19792. 15470. 17305. 16069.
6 6      1501   5769  12730  18339. 17369  18645. 18463.

我想检索每个位置的3个数据帧的平均值。我试着去看看How to get mean, median, and other statistics over entire matrix, array or dataframe?。然而,我无法得到每个位置的3个数据帧的平均值

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2020-01-07 12:38:06

由于第一列是character,我假设您希望忽略所有数据帧中的该列。你可以做到

代码语言:javascript
运行
复制
(df1[-1] + df2[-1] + df3[-1])/3

如果有多个这样的数据帧,将它们放在一个列表中并使用Reduce

代码语言:javascript
运行
复制
list_df <- list(df1[-1], df2[-1], df3[-1])
Reduce("+", list_df) / length(list_df)

或者使用管道

代码语言:javascript
运行
复制
library(magrittr)
library(purrr)

list_df %>% reduce(`+`) %>% divide_by(length(list_df))
票数 4
EN

Stack Overflow用户

发布于 2020-01-07 14:51:21

当数据都是数字时,更常见的是使用矩阵而不是数据帧,后者可以放入数组(多维矩阵)中。您可以将信息从字符列"Strain"转换为行名并将其删除。因此,您计划进行的计算最容易完成。

代码语言:javascript
运行
复制
apply(A, 1:2, mean)  # mean of superimposed cells 
#   X1 X2 X3 X4
# 1  2  5  8 11
# 2  3  6  9 12
# 3  4  7 10 13

为了得到数组,我将使用这个小数据。帧到矩阵转换器的辅助函数,

代码语言:javascript
运行
复制
d2m <- function(d, excl=1) `rownames<-`(as.matrix(d[-excl]), d[, 1])

where excl=排除列(这里只有1)。

可以使用带有选项simplify="array"sapply (lappy的近亲)将d2m同时应用于所有数据帧。要列出您的数据框,您可以使用list(df1, df2, ...)或使用mget()并像我一样按模式列出。

代码语言:javascript
运行
复制
A <- sapply(mget(ls(pattern="^Results")), d2m, simplify="array")

数组看起来像这样,

代码语言:javascript
运行
复制
A
, , Results_first_experiment

  X1 X2 X3 X4
1  1  4  7 10
2  2  5  8 11
3  3  6  9 12

, , Results_second_experiment

  X1 X2 X3 X4
1  2  5  8 11
2  3  6  9 12
3  4  7 10 13

, , Results_third_experiment

  X1 X2 X3 X4
1  3  6  9 12
2  4  7 10 13
3  5  8 11 14

其中每个矩阵都可以使用A[,,1]A[,,2]等单独访问。

现在所有的计算都可以轻松地完成了,试试:

代码语言:javascript
运行
复制
apply(A, 1:2, mean)  # mean superimposed cells
apply(A, c(1, 3), mean)  # row means each matrix
apply(A, c(2, 3), mean)  # column means each matrix
apply(A, 1, mean)  # mean superimposed rows
apply(A, 2, mean)  # mean superimposed columns
apply(A, 3, mean)  # entire mean of each matrix
mean(A)  # mean of entire array

如果您已经在使用矩阵,则它们可能会按如下方式排列:

代码语言:javascript
运行
复制
A <- array(c(m1, m2, m3), dim=c(3, 4, 3))  # Note: dim=c(nrow, ncol, nmat)

数据:

代码语言:javascript
运行
复制
Results_first_experiment <- structure(list(St = c("1", "2", "3"), X1 = 1:3, X2 = 4:6, X3 = 7:9, 
    X4 = 10:12), class = "data.frame", row.names = c(NA, -3L))

Results_second_experiment <- structure(list(St = c("1", "2", "3"), X1 = c(2, 3, 4), X2 = c(5, 
6, 7), X3 = c(8, 9, 10), X4 = c(11, 12, 13)), class = "data.frame", row.names = c(NA, 
-3L))

Results_third_experiment <- structure(list(St = c("1", "2", "3"), X1 = c(3, 4, 5), X2 = c(6, 
7, 8), X3 = c(9, 10, 11), X4 = c(12, 13, 14)), class = "data.frame", row.names = c(NA, 
-3L))
票数 0
EN

Stack Overflow用户

发布于 2020-01-07 16:05:50

首先,在数据表或矩阵中,我建议您不要只用数字命名列。如果你在职位上工作,你可以命名为'p.1','pos.1‘等。

当您对对象重复使用data.frames时(此处为您的位置),您可以使用tidyverse轻松处理。下面是一个简单的示例,您可以将其转换为您的数据:

代码语言:javascript
运行
复制
size <- 5
vec.list <- vector("list", size)
position <- paste0("position.", 1:size)

for(i in 1:size){
  a <- runif(5, 0, 1)
  b <- rnorm(5, 2, 4)
  c <- rnorm(5, 0.5, 1)
  vec.list[[i]] <- data.frame(position, a, b, c)
}
vec.list

# unlist to get a data.frame and sort according to position
df.pos <- do.call(rbind.data.frame, vec.list) %>% arrange(position)

# use tidyr::nest() to nest your data by position
pos.nested <- df.pos %>% group_by(position) %>% nest()

# Then use purrr::map() functions to work on nested data
map(.x = pos.nested$data, .f = ~mean(.x$a, na.rm = T))
map(.x = pos.nested$data, .f = ~sd(.x$c, na.rm = T))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59622149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档