从R中的高数据或宽数据计算平均值

Calculating means from tall data or wide data in R

我是一名初中级 R 用户,几个月前开始学习 R 用于实验室研究。感谢您的耐心等待——特别是如果这最终成为一个非常愚蠢的简单问题。

问题

tables 作为可重现的例子

以下代码生成与我的集合类似的 tables,第一个是高数据,第二个是宽数据。

library(tibble)
#> Warning: package 'tibble' was built under R version 3.4.4
library(tidyr)
#> Warning: package 'tidyr' was built under R version 3.4.4

tall <- tibble(X=c(3999.387, 3999.387, 3999.387,
                     3999.066, 3999.066, 3999.066,
                     3998.745, 3998.745, 3998.745,
                     3998.423, 3998.423, 3998.423,
                     3998.102, 3998.102, 3998.102), 
       Y=rnorm(15, mean=2, sd=1), 
       S=c("s1","s2","s3","s1","s2","s3","s1","s2","s3","s1","s2","s3","s1","s2","s3"))
head(tall)
#> # A tibble: 6 x 3
#>       X     Y S    
#>   <dbl> <dbl> <chr>
#> 1 3999. 3.07  s1   
#> 2 3999. 1.81  s2   
#> 3 3999. 4.02  s3   
#> 4 3999. 1.21  s1   
#> 5 3999. 0.771 s2   
#> 6 3999. 2.39  s3

wide <- spread(tall,X,Y)
head(wide)
#> # A tibble: 3 x 6
#>   S     `3998.102` `3998.423` `3998.745` `3999.066` `3999.387`
#>   <chr>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
#> 1 s1         0.454      1.50       1.84       1.21        3.07
#> 2 s2         2.04       0.392      1.50       0.771       1.81
#> 3 s3         1.38       0.992      0.790      2.39        4.02

reprex package (v0.2.1)

于 2018-11-08 创建

在高版本中,X 的每个唯一值都会重复 S 的每个唯一值。有 5 个独特的 X 和 3 个独特的 S。这在广泛的数据中更为明显。在我的真实集合中,我有 8010 个独特的 X 和 312 个独特的 S。 tall 数据很好,因为我可以轻松地绘制 XY 并为每个 S.

绘制一条线

问题

如果我想在 X 的每个唯一值处对所有 Y 取平均值怎么办?它看起来像这样:

> # A tibble: 5 x 2
>       X     Y
>   <dbl>     <dbl>
> 1 3998.102  2.29
> 2 3998.423  1.63
> 3 3999.745  1.36
> 4 3999.066  1.66
> 5 3999.387  1.33  

在这种情况下我使用了宽table,计算了每个X列的平均值,然后手动构建了一个新的table.

我可以使用 purrr 中的 map() 函数来实现吗?文档很混乱,可能是因为我以前从未使用过 lapply() 函数。

感谢阅读。我觉得这对于大多数有经验的用户来说真的很简单。

您要找的是 dplyr 包,它是 tidyverse 的核心。我将向您展示如何使用它实现您想要做的事情,但是网上有大量关于它的教程,一旦您了解了如何使用它,它就会非常简单。

require(dplyr)
group_by(tall,X) %>%
  summarize(meanY=mean(Y))

首先,您可以告诉 dplyr 做任何您想做的事情,就像您的数据根据​​分组列(在本例中为 X)分解成单独的 data.frames 一样。 另外,请注意,使用 dplyr,您可以使用 %>% "pipe" 命令,这意味着一个命令的结果将作为第一个参数传输到下一个命令,因此您不需要每次都分配它或嵌套所有命令。

第二行创建一个新的 table,其中对于每个组(基于其 X),它计算所有 Ymean。结果是这样的:

# A tibble: 5 x 2
      X meanY
  <dbl> <dbl>
1 3998. 0.781
2 3998. 1.81 
3 3999. 1.37 
4 3999. 2.01 
5 3999. 2.02 

就是这样。你完成了。它真的很强大,简单易学。 您可以使用的另一个包是 data.table,但我发现它的强大和简洁是以更难学习为代价的(无论如何对我来说)。使用 dplyr 做事可能需要更多行,但我更容易弄清楚实现任何目标所需采取的步骤。

祝你好运!