专栏首页生信了R(二)近期记录

R(二)近期记录

本文是笔者近期使用R语言的一个记录。

计算各列的NA数量

这个可以用apply或者sapply快速实现

> df <- data.frame(col1=c(1, NA, 2), col2=c(2, 3, NA), col3=c(NA, NA, 3))
> df
  col1 col2 col3
1    1    2   NA
2   NA    3   NA
3    2   NA    3
> sapply(df, function(v) sum(is.na(v)))
col1 col2 col3 
   1    1    2 

或者:

> apply(df, 2, function(v) sum(is.na(v)))
col1 col2 col3 
   1    1    2 

关于apply的说明

apply对一行或者一列是按照向量来处理的

假设要对每一行求和

> df <- data.frame(a=c(1, 2), b=c(3, 4), d=c("5", "6"), stringsAsFactors=F)
> str(df)
'data.frame':   2 obs. of  3 variables:
 $ a: num  1 2
 $ b: num  3 4
 $ d: chr  "5" "6"
> apply(df, 1, function(v) sum(as.numeric(v)))
[1]  9 12

这个功能很简单也很常用,但是不加注意还是容易写错,比如只对每一行的前两个元素求和:

> apply(df, 1, function(v) sum(v[1:2]))
Error in sum(v[1:2]): 'type'(character)参数不对

会报错,提示参数类型不对。 按道理前两列都是数值型,那么apply后每一行的前两个元素也应该是数值型呀,那是不是呢,我们看看:

> apply(df, 1, function(v) mode(v[1:2]))
[1] "character" "character"

不是预想中的数值型,而是字符型。其实apply是将每一行当作一个向量来处理的。因为第三列是字符型,所以当一行中只要有一个值是字符型,其他数值型的值都会被自动转换为字符型。

上面说了那么多,关键就是apply是把一行或者一列当作向量来处理的;R中的向量要求值类型一致。 我看到不少人,包括我自己,都曾经因为不知道这一点而吃亏。

apply中可以利用行名或者列名来增强可读性

什么意思呢?比如在下面这个数据集中我们想计算每个人语文成绩和英语成绩的和。可以

> df <- data.frame(a=1:3, b=6:8)
> row.names(df) <- c("chi", "math", "eng")
> df
     a b
chi  1 6
math 2 7
eng  3 8
> apply(df, 2, function(v) v[1] + v[3])
 a  b 
 4 14 

但其实如果用行名的话,可以更一目了然,并且不会受行顺序的影响。

> apply(df, 2, function(v) v["chi"] + v["eng"])
 a  b 
 4 14 

列名也是类似的用法。

当然,上面的两个例子中代码都不是最佳的,只是为了说明问题姑且那样写。

移动文件

R语言对目录和文件的操作有一些基本的支持。网上又很多的教程,但是当我想找一个函数把一个文件从一个目录移动到另一个目录的时候,却都没找到。 后来自己回想了一下Linux中目录的本质,移动文件一般就是改变其“完整的路径名”。于是上述功能其实可以用file.rename函数来实现。 比如,要把1.txt从dir1中移到dir2中,可以这样写:

> file.rename("dir1/1.txt", "dir2/1.txt")
[1] FALSE

或者更简单的写法:

> file.rename("dir1/1.txt", "dir2")
[1] FALSE

结果是FALSE表示没有移动成功,那是肯定的,因为目录都是我假想的。如果你用真实的目录和文件来操作,是会成功的。

dplyr包

最近用dplyr包的次数比较多,虽然还不是很熟练,但已经感到用它的好处了。除了代码变简洁之外,最大的好处就是灵活。 我们经常要对一个数据集做多步处理,如果用基础包里的功能也能实现,但是一旦需要调整处理的先后顺序,那就很麻烦,通常需要进行很大的改动。但是如果用dplyr包就可以轻松很多。

按行合并list中的向量

用dplyr包中的bind_rows函数实现

> lis <- list(
+   a=1:5,
+   b=2:6,
+   d=3:7
+ )
> library(dplyr)
> t(bind_rows(lis))
  [,1] [,2] [,3] [,4] [,5]
a    1    2    3    4    5
b    2    3    4    5    6
d    3    4    5    6    7

用Reduce函数实现

> Reduce(rbind, lis, init=NULL)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    2    3    4    5    6
[3,]    3    4    5    6    7

如何从字符串中提取特定值

比如,如何从“d 0 a 1 b 2 c 3 a 6 d 9”中只提取紧接在a后面的数字。以前都是这样做:

> library(stringr)
> s = "d 0 a 1 b 2 c 3 a 6 d 9"
> s
[1] "d 0 a 1 b 2 c 3 a 6 d 9"
> tmp <- str_extract_all(s, "a \\d+")
> tmp
[[1]]
[1] "a 1" "a 6"
> lapply(tmp, function(v) str_extract_all(v, "\\d+"))
[[1]]
[[1]][[1]]
[1] "1"

[[1]][[2]]
[1] "6"

然后再将结果转为向量。 很长一段时间内都是这样做的,但是我一直记得Python中可以很方便的用()直接提取想要的部分。 所以,最近又仔细看了一下正则表达式的规则,还真发现了一个新方法:

> str_extract_all(s, "(?<=a )\\d+")
[[1]]
[1] "1" "6"

其中,(?<=pattern) 表示前面匹配,比如 (?<=a )\d+ 表示前面匹配了a和空格的数字。

最后

近期使用R语言的一些收获罗列于此,希望能对大家有所助益。

本文分享自微信公众号 - 生信了(gh_ed36a29a9a9d)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小白入门:学习Python还是R

    各位HR宝宝们在研究Anaconda的时候或许已经发现了,Anaconda Navigator的页面中有一个尚未安装的应用——R studio

    二号姬
  • C++ OpenCV之鼠标响应事件

    在OpenCV中也存在鼠标的操作,今天我们先介绍一下鼠标中的操作事件,用于为之后的GrabCut分割来做个前提。

    Vaccae
  • 手把手教你做倾向评分匹配

    各位科研芝士的朋友大家好,今天和大家分享一下新的知识点—PSM,或许大家早已听过这个名词了,或许你对它还是半知半解,不过没关系,希望可以通过今天的帖子帮助你对该...

    百味科研芝士
  • R语言 常见函数知识点梳理与解析 | 精选分析

    R语言 控制流:for、while、ifelse和自定义函数function|第5讲

    1480
  • 手把手教你比较两个模型的预测能力

    各位科研芝士的朋友,大家好。最近学习到用NRI进行模型比较,起初当听到NRI这个词的时候,我的表情可能是这样的。

    百味科研芝士
  • Anaconda:剪切板数据读取(Python&R)

    Python和R都是免费的开源软件,这类软件有一个对小白新手非常友好的特点,那就是……哪里不会查哪里,随用随学……所以,别的理论不说现在要开始进行数据分析啦~

    二号姬
  • 我的5年Python7年R,述说她们的差异在哪里?

    首次接触R语言是在2012年读研的时候,有一门课程是统计分析与R语言,清晰地记得期末考试时,由于把答案给同学抄,最终落了个重考的后果(重考92分)。那个时候真的...

    1480
  • 深入机器学习系列之Factorization Machines & Online Optimization

    今日头条丨一点资讯丨腾讯丨搜狐丨网易丨凤凰丨阿里UC大鱼丨新浪微博丨新浪看点丨百度百家丨博客中国丨趣头条丨腾讯云·云+社区

    数据猿
  • 学习Julia与弯道超车

    看一下Julia官网上的Benchmark,Julia综合速度,是R语言的42倍,是Python的15倍,是Java的3倍,是Fortran的1倍,和C语言速度...

    邓飞
  • 一些特别实用的在线工具分享给你!

    这是一个在线的PS工具,很多人学习专业的Photoshop有难度,那么可以试试这个简单版的在线PS。

    FreeRonin

扫码关注云+社区

领取腾讯云代金券