从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 数据很好,因为我可以轻松地绘制 X
与 Y
并为每个 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),它计算所有 Y
的 mean
。结果是这样的:
# 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 做事可能需要更多行,但我更容易弄清楚实现任何目标所需采取的步骤。
祝你好运!
我是一名初中级 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 数据很好,因为我可以轻松地绘制 X
与 Y
并为每个 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),它计算所有 Y
的 mean
。结果是这样的:
# 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 做事可能需要更多行,但我更容易弄清楚实现任何目标所需采取的步骤。
祝你好运!