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

时间:2018-11-08 16:14:36

标签: r dplyr reshape lapply purrr

我是R的初级中级用户,几个月前开始学习R进行实验室研究。感谢您的耐心配合,尤其是如果这最终成为一个非常愚蠢的简单问题。

问题

这些表是可复制的示例

以下代码生成与我的集合相似的表,首先是高数据表,其次是宽数据表。

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。较高的数据很好,因为我可以轻松绘制XY并为每个S绘制一条线。

问题

如果我想将所有Y的平均值平均为X的每个唯一值,该怎么办?看起来像这样:

> # 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  

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

我可以使用map()中的purrr函数执行此操作吗?该文档令人困惑,可能是因为我以前从未使用过lapply()函数。

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

1 个答案:

答案 0 :(得分:1)

您要寻找的是dplyr软件包,它是tidyverse的核心。我将向您展示如何实现您要使用的功能,但是在线提供了很多教程,一旦您了解如何使用它就非常简单。

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

首先,您可以告诉dplyr做您想做的所有事情,就好像您的数据基于分组列(在本例中为X)分为单独的data.frames一样。 另外,请注意,使用dplyr时,您可以使用%>%来“管道”命令,这意味着一个命令的结果将作为第一个参数传送到下一个命令,因此您不必每次都分配或嵌套您所有的命令。

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

# 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进行操作可能需要更多的代码,但是对于我来说,为实现任何目标而需要采取的步骤更加容易困惑。

祝你好运!