R语言基础系列:

  • 你知道R中的赋值符号箭头(<-)和等号(=)的区别吗?

  • 1数据类型(向量、数组、矩阵、 列表和数据框)

  • 2读写数据所需的主要函数、与外部环境交互

  • 3数据筛选——提取对象的子集

  • 4向量、矩阵的数学运算

  • 5控制结构

  • 6函数及作用域

  • 7认识循环函数、lapply和sapply

split()

split()不是一个循环函数,但它和lapply()还有sapply()等一起使用起来很方便。

split()的参数是一个向量,和tapply()类似,但是并不计算概括统计量。它所做的是接收一个向量或对象x,然后接收一个因子变量f,f用来指定分组的水平(level),x根据f进行分组,分组之后返回一个列表,我们就可以对这些独立的组使用lapply()或者sapply()

> str(split)
function (x, f, drop = FALSE, ...)

举例,和前一节的tapply()类似,生成三组随机数,然后通过split()进行分组,

因子变量设置为3,将x向量分解成3组,可以得到以下这个列表,三个元素:

> x <- c(rnorm(10), runif(10),rnorm(10,1))
> f<- gl(3,10)
> split(x,f)
$`1`[1]  0.5370274 -0.8772336 -0.1203692 -1.6985533 -0.6796235[6] -1.0284270  1.9282473  0.5562795  0.2560315  0.1244326$`2`[1] 0.88297485 0.56093613 0.98450850 0.05455810 0.43596680[6] 0.01397831 0.41145110 0.43259515 0.85048958 0.10283914$`3`[1] 3.0159349 0.3021140 0.7565265 1.4841716 1.2435489[6] 1.6161955 1.3092779 1.2535495 1.1271382 1.0764003

分组之后使用循环函数lapply()或者sapply(),求每个组中的统计值

结合起来用是这样的:

> lapply(split(x,f),mean)
$`1`
[1] -0.1107231$`2`
[1] 0.6810998$`3`
[1] 1.115751

其实,在这个例子中我们大可不必使用split,因为tapply()也可以达到完全一样的效果,而且会更加紧凑

split()最大的好处是它可以用于分解数据框

Splitting a Data Frame

以datasets数据集中的空气质量(airquality)数据集为例,可以看到数据集中包含臭氧、太阳辐射、风力、温度等测量值,以及月份、日期两个测量时间:

> library(datasets)
> head(airquality)Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6

假如我们想计算臭氧、辐射、风力、温度等测量值在某个月份内的平均值,那就要先使用split对数据进行分类:

  • 首先将整个数据框按月分组,将f因子设置为离散型变量month

> s <- split(airquality, airquality$Month)
  • 然后使用lapply()计算不同列的均值,其中使用匿名函数function(x),计算三个变量的均值:

> lapply(s, function(x) {colMeans(x[, c("Ozone", "Solar.R", "Wind")])})
$`5`Ozone  Solar.R     Wind NA       NA 11.62258 $`6`Ozone   Solar.R      Wind NA 190.16667  10.26667 $`7`Ozone    Solar.R       Wind NA 216.483871   8.941935 $`8`Ozone  Solar.R     Wind NA       NA 8.793548 $`9`Ozone  Solar.R     Wind NA 167.4333  10.1800

可以看到结果中lapply()对每个月份都返回了一个列表,列表中的每个元素是一个长度为3的向量,代表三个变量在这个月中的均值。

lapply()的缺点是以列表的形式返回的数据不够紧凑。因为每个向量长度都是3,我们可以通过sapply()函数,简化数据,返回一个三行五列的矩阵,如下:

> sapply(s, function(x) {colMeans(x[, c("Ozone", "Solar.R", "Wind")])})5         6          7        8        9
Ozone         NA        NA         NA       NA       NA
Solar.R       NA 190.16667 216.483871       NA 167.4333
Wind    11.62258  10.26667   8.941935 8.793548  10.1800

其中Ozone一列数据为NA,这是因为原始数据中有很多NA缺失值,所以,结果也是NA。

怎么去除NA?

colMeans()函数传递一个na.rm参数,从而在每次计算平均值之前先移除每一列的缺失值:

> sapply(s, function(x) {colMeans(x[, c("Ozone", "Solar.R", "Wind")], na.rm = TRUE)})5         6          7          8         9
Ozone    23.61538  29.44444  59.115385  59.961538  31.44828
Solar.R 181.29630 190.16667 216.483871 171.857143 167.43333
Wind     11.62258  10.26667   8.941935   8.793548  10.18000

Splitting on More than one Level

split还可以用于基于多个水平的分解:

在前面的例子中,我们只有一个因子变量用于分组,如果我们有多个因子变量,比如性别、种族等,这些因子变量组合起来会产生多个水平,这时怎么办?

举例

创建一个数字向量x,包含10个随机数字,创建两个因子变量f1和f2,分别有2个和5个水平:

> x <- rnorm(10)
> f1 <- gl(2,5)
> f2 <- gl(5,2)
> f1[1] 1 1 1 1 1 2 2 2 2 2
Levels: 1 2
> f2[1] 1 1 2 2 3 3 4 4 5 5
Levels: 1 2 3 4 5

使用interaction()函数,把这两个变量组合起来,就生成了10个水平:

> interaction(f1,f2)[1] 1.1 1.1 1.2 1.2 1.3 2.3 2.4 2.4 2.5 2.5
Levels: 1.1 2.1 1.2 2.2 1.3 2.3 1.4 2.4 1.5 2.5

所以使用split()分解数值向量x:

PS. 我们也可以使用list(f1, f2),直接把两个因子作为列表传递给因子变量f:

> str(split(x, list(f1, f2)))
List of 10$ 1.1: num [1:2] -1.01909 -0.00339$ 2.1: num(0) $ 1.2: num [1:2] -0.0772 -0.5811$ 2.2: num(0) $ 1.3: num -1.68$ 2.3: num 0.21$ 1.4: num(0) $ 2.4: num [1:2] 2.02 -0.96$ 1.5: num(0) $ 2.5: num [1:2] -0.172 -0.262

这时我们可以看到,不是每个水平上都有观测值,这是正常的情况,我们也可以设置不显示这些没有元素的分组,使用参数drop = TRUE)

> str(split(x, list(f1, f2), drop = TRUE))
List of 6$ 1.1: num [1:2] -1.01909 -0.00339$ 1.2: num [1:2] -0.0772 -0.5811$ 1.3: num -1.68$ 2.3: num 0.21$ 2.4: num [1:2] 2.02 -0.96$ 2.5: num [1:2] -0.172 -0.262

就这样分组完成后,可以使用其他循环函数再进行计算。

上面的结果中,我们用到了一个没见过的函数——str(),下面介绍一下它。

最重要的查看函数——str()

str()代表的是structure,用来查看对象内容,是一个简单的诊断函数,可用来替代summary()

我们可以用它来查看大型列表,结构紧凑

> library(datasets)
> str(airquality)
'data.frame':    153 obs. of  6 variables:$ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...$ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...$ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...$ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...$ Month  : int  5 5 5 5 5 5 5 5 5 5 ...$ Day    : int  1 2 3 4 5 6 7 8 9 10 ...

我们也可以用它来查看函数功能,显示参数和概要

> str(lm)
function (formula, data, subset, weights, na.action, method = "qr", model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE, contrasts = NULL, offset, ...)

总之我们可以用str()查看各种对象。

例如,生成一组含有100个正态随机数字的向量,平均值为2,标准差为4,然后通过summary()函数返回6个概括统计量,分别是最小值、第25百分位数、中位数、平均数、第75百分位数以及最大值,从中粗略的告诉你这个数列的范围以及离散情况:

> x<-rnorm(100, 2, 4)
> summary(x)Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
-7.6578  0.3534  3.4114  3.1488  5.5520 13.9290

使用str()函数,他会告诉你x是一个数值向量,含有100个数字

> str(x)num [1:100] 4.06 3.82 6.28 8.09 2.15 ...

再例如,生成一个10*10的矩阵,用str()查看

> m <- matrix(rnorm(100), 10, 10)
> str(m)num [1:10, 1:10] 1.0524 -0.2367 0.0713 0.4177 0.1186 ...

参考资料:

  1. 视频课程 R Programming by Johns Hopkins University:https://www.coursera.org/learn/r-programming/home/welcome

  2. 讲义 Programming for Data Science :https://bookdown.org/rdpeng/rprogdatascience/R

猜你喜欢

10000+:肠道细菌 人体上的生命 宝宝与猫狗 梅毒狂想曲 提DNA发Nature 实验分析谁对结果影响大  Cell微生物专刊

系列教程:微生物组入门 Biostar 微生物组  宏基因组

专业技能:生信宝典 学术图表 高分文章 不可或缺的人

一文读懂:宏基因组 寄生虫益处 进化树

必备技能:提问 搜索  Endnote

文献阅读 热心肠 SemanticScholar Geenmedical

扩增子分析:图表解读 分析流程 统计绘图

16S功能预测   PICRUSt  FAPROTAX  Bugbase Tax4Fun

在线工具:16S预测培养基 生信绘图

科研经验:云笔记  云协作 公众号

编程模板 Shell  R Perl

生物科普  生命大跃进  细胞暗战 人体奥秘

写在后面

为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外150+ PI,1500+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍末解决群内讨论,问题不私聊,帮助同行。

学习16S扩增子、宏基因组科研思路和分析实战,关注“宏基因组”

R语言笔记8:两个重要函数——用来分解数据框的split和用来查看对象的str相关推荐

  1. R语言ggplot2可视化:使用geom_line函数将dataframe中数据可视化为时间序列(或折线图)(Time Series Plot From a Data Frame)、添加标题、副标题

    R语言ggplot2可视化:使用geom_line函数将dataframe中数据可视化为时间序列(或折线图)(Time Series Plot From a Data Frame).添加标题.副标题. ...

  2. R语言使用yardstick包的roc_curve函数评估多分类(Multiclass)模型的性能、查看模型在多分类每个分类上的ROC曲线(roc curve)

    R语言使用yardstick包的roc_curve函数评估多分类(Multiclass)模型的性能.查看模型在多分类每个分类上的ROC曲线(receiver operating characteris ...

  3. R语言使用haven包的read_spss函数读取spss格式数据、使用haven包的read_sas函数读取SAS格式数据、使用haven包的read_dta函数读取Stata格式数据

    R语言使用haven包的read_spss函数读取spss格式数据.使用haven包的read_sas函数读取SAS格式数据.使用haven包的read_dta函数读取Stata格式数据 目录

  4. R语言笔记7:认识循环函数、lapply和sapply

    R语言基础系列: 你知道R中的赋值符号箭头(<-)和等号(=)的区别吗? 1数据类型(向量.数组.矩阵. 列表和数据框) 2读写数据所需的主要函数.与外部环境交互 3数据筛选--提取对象的子集 ...

  5. R语言笔记7:functions——编写函数所需的基础知识

    上一讲通过三个简单的例子体验了一下如何在R中写函数,下面来详细学习有关R语言中函数的知识. Functions in R 主要分三个部分来讲解函数: 编写函数所需的基础知识 相关语法作用域 R语言作用 ...

  6. r语言导出html改不了名,请问如何进行数据框列的重命名?

    假设有三组数据: > weight = c(150, 135, 210, 140) > height = c(65, 61, 70, 65) > gender = c("F ...

  7. 《R语言游戏数据分析与挖掘》一2.2 数据对象

    2.2 数据对象 R拥有许多用于存储数据的对象类型,包括向量.矩阵.数组.数据框和列表.它们在存储数据的类型.创建方式.结构复杂度,以及用于定位和访问其中个别元素的标记等方面均有所不同.多样化的数据对 ...

  8. R语言笔记2:读写数据所需的主要函数、与外部环境交互

    R语言基础系列前情提要: - 1数据类型(向量.数组.矩阵. 列表和数据框) Getting Data In and Out of R (一)读取数据 读取数据所需的几种函数: read.table. ...

  9. R语言使用cowplot包的plot_grid函数将两个ggplot2可视化结果并排组合起来并添加图像标签A、B、设置组合图像使用共享的图例(shared legend in cowplot)

    R语言使用cowplot包的plot_grid函数将两个ggplot2可视化结果并排组合起来并添加图像标签A.B.设置组合图像使用共享的图例(combine two plots side by sid ...

最新文章

  1. 解决:angularjs radio默认选中失效问题
  2. 存储 dict 的元素前是计算 key 的 hash 值?
  3. 2018/12/05 PAT刷题 L1-018 大笨钟 Java
  4. PyTorch | (4)神经网络模型搭建和参数优化
  5. DVWA系列之21 存储型XSS分析与利用
  6. 小米网络推广连夜更换品牌LOGO——科技越是进化就越接近生命的形态
  7. hdu2065(指数型母函数+快速幂)
  8. iOS逆向之深入解析如何使用Theos开发插件
  9. Delphi 26 岁
  10. LeetCode 648. 单词替换(Trie树)
  11. python解析二维码_Python二维码生成识别实例详解
  12. odom_out_and_back.cpp
  13. jsonp使用,spring4.x对jsonp的支持
  14. dell4600服务器不能启动
  15. 我们在 web 应用开发过程中经常遇到输出某种编码的字 符, 如 iso8859-1 等, 如何输出一个某种编码的字符串?...
  16. 基数树(radix tree)
  17. android软件安全权威指南 pdf_目录公众号内的所有资源软件!
  18. 使用Simian检查Java项目中冗余代码
  19. [python] 获取股票信息
  20. 生成自己的浏览器证书

热门文章

  1. OpenCV Python在计算机视觉中的应用
  2. 忽悠马云10亿的骗子,还了阿里4500亿:做对事赢一场,跟对人赢一生!
  3. 国内有没有能媲美Jira的测试管理工具?我们找国内产品来测评一下
  4. OA发展史:由点到生态
  5. 轻雀世界知名体育用品零售商D的交流与思考
  6. 芯片、模组、开发板的区别与联系-结合ESP32浅谈(转载)
  7. 【swjtu】数字电路实验3_1位十进制计数器
  8. 【swjtu】数据结构实验5_基于十字链表的稀疏矩阵转置
  9. 复习07统计学习方法(支持向量机SVM)---图片版
  10. Redis设计与实现