我是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
。较高的数据很好,因为我可以轻松绘制X
与Y
并为每个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()
函数。
感谢您的阅读。我觉得对于大多数有经验的用户来说,这真的很简单。
答案 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进行操作可能需要更多的代码,但是对于我来说,为实现任何目标而需要采取的步骤更加容易困惑。
祝你好运!