我有3个维度相似的数据帧,结构如下:
> 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个数据帧的平均值
任何帮助都将不胜感激。
发布于 2020-01-07 12:38:06
由于第一列是character,我假设您希望忽略所有数据帧中的该列。你可以做到
(df1[-1] + df2[-1] + df3[-1])/3如果有多个这样的数据帧,将它们放在一个列表中并使用Reduce
list_df <- list(df1[-1], df2[-1], df3[-1])
Reduce("+", list_df) / length(list_df)或者使用管道
library(magrittr)
library(purrr)
list_df %>% reduce(`+`) %>% divide_by(length(list_df))发布于 2020-01-07 14:51:21
当数据都是数字时,更常见的是使用矩阵而不是数据帧,后者可以放入数组(多维矩阵)中。您可以将信息从字符列"Strain"转换为行名并将其删除。因此,您计划进行的计算最容易完成。
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为了得到数组,我将使用这个小数据。帧到矩阵转换器的辅助函数,
d2m <- function(d, excl=1) `rownames<-`(as.matrix(d[-excl]), d[, 1])where excl=排除列(这里只有1)。
可以使用带有选项simplify="array"的sapply (lappy的近亲)将d2m同时应用于所有数据帧。要列出您的数据框,您可以使用list(df1, df2, ...)或使用mget()并像我一样按模式列出。
A <- sapply(mget(ls(pattern="^Results")), d2m, simplify="array")数组看起来像这样,
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]等单独访问。
现在所有的计算都可以轻松地完成了,试试:
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如果您已经在使用矩阵,则它们可能会按如下方式排列:
A <- array(c(m1, m2, m3), dim=c(3, 4, 3)) # Note: dim=c(nrow, ncol, nmat)数据:
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))发布于 2020-01-07 16:05:50
首先,在数据表或矩阵中,我建议您不要只用数字命名列。如果你在职位上工作,你可以命名为'p.1','pos.1‘等。
当您对对象重复使用data.frames时(此处为您的位置),您可以使用tidyverse轻松处理。下面是一个简单的示例,您可以将其转换为您的数据:
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))https://stackoverflow.com/questions/59622149
复制相似问题