R语言进阶笔记3 | dplyr常用函数介绍

R语言 育种数据
邓飞    2020-12-30    822

dplyr介绍

管道符%/%

管道符在Rstudio中快捷键是Ctrl + Shift + M,打印出来是%/%,它可以将前面的结果传递到后面作为参数

图片

比如

sum(c(1:10))可以写为c(1:10) %/% sum(),即%/%c(1:10)作为参数传递给了sum()函数。

❝❝

飞哥注:这个符号,在RStudio中用着特别方便,而且少了很多中间变量,代码更加清晰和简洁。

❞❞

mutate()函数

这个函数,可以在对列赋值,更改。这里使用learnasreml包中的数据shaw.oats作为演示,如果没有安装这个包,可以运行下面代码进行安装:

install.packages("agridat")

下面看一下数据的预览和结构:

> head(dat)
   env year block gen yield
1 Pusa 1932    B1   A  26.5
2 Pusa 1932    B2   A  38.0
3 Pusa 1932    B3   A  22.5
4 Pusa 1932    B4   A  18.0
5 Pusa 1932    B5   A  22.5
6 Pusa 1933    B1   A  37.5
> str(dat)
'data.frame': 390 obs. of  5 variables:
 $ env  : Factor w/ 2 levels "Karnal","Pusa": 2 2 2 2 2 2 2 2 2 2 ...
 $ year : int  1932 1932 1932 1932 1932 1933 1933 1933 1933 1933 ...
 $ block: Factor w/ 5 levels "B1","B2","B3",..: 1 2 3 4 5 1 2 3 4 5 ...
 $ gen  : Factor w/ 13 levels "A","B","C","D",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ yield: num  26.5 38 22.5 18 22.5 37.5 31.5 28 32.5 40.5 ...

这里对yield进行log转换,保存为logyield

> dat %>% mutate(logyiled = log10(yield)) %>% head
   env year block gen yield logyiled
1 Pusa 1932    B1   A  26.5 1.423246
2 Pusa 1932    B2   A  38.0 1.579784
3 Pusa 1932    B3   A  22.5 1.352183
4 Pusa 1932    B4   A  18.0 1.255273
5 Pusa 1932    B5   A  22.5 1.352183
6 Pusa 1933    B1   A  37.5 1.574031

对列操作select

提取env,year,yield三列

> dat %>% select(env,year,yield) %>% head
   env year yield
1 Pusa 1932  26.5
2 Pusa 1932  38.0
3 Pusa 1932  22.5
4 Pusa 1932  18.0
5 Pusa 1932  22.5
6 Pusa 1933  37.5

数据框中,用到的方法需要用c()定义为一个向量,然后还要加引号,没有mutate简洁,R中的base函数操作:

> dat[,c("env","year","yield")] %>% head
   env year yield
1 Pusa 1932  26.5
2 Pusa 1932  38.0
3 Pusa 1932  22.5
4 Pusa 1932  18.0
5 Pusa 1932  22.5
6 Pusa 1933  37.5

select如果不想要某一列了,可以用-号去掉就行。

对行操作filter

提取year == 1933的数据:

> dat %>% filter(year == "1933") %>% head
     env year block gen yield
1   Pusa 1933    B1   A  37.5
2   Pusa 1933    B2   A  31.5
3   Pusa 1933    B3   A  28.0
4   Pusa 1933    B4   A  32.5
5   Pusa 1933    B5   A  40.5
6 Karnal 1933    B1   A  29.0

提取year == 1933,并且env == “Karnal”的数据:

> dat %>% filter(year == "1933" & env == "Karnal") %>% head
     env year block gen yield
1 Karnal 1933    B1   A  29.0
2 Karnal 1933    B2   A  36.0
3 Karnal 1933    B3   A  38.0
4 Karnal 1933    B4   A  40.0
5 Karnal 1933    B5   A  40.0
6 Karnal 1933    B1   B  27.5

分组操作group_by

看一下不同年份,不同地点的观测值个数

> dat %>% group_by(env,year) %>% count()
# A tibble: 6 x 3
# Groups:   env, year [6]
  env     year     n
     
1 Karnal  1932    65
2 Karnal  1933    65
3 Karnal  1934    65
4 Pusa    1932    65
5 Pusa    1933    65
6 Pusa    1934    65

汇总函数summarise

每一次调用summary时,都会推荐我summarise函数,但是我很少用这个函数。其实它与group_by函数联合一起,非常强大。

看一下不同年份,不同地点的产量平均值

> dat %>% group_by(env,year) %>% summarise(mean(yield))
`summarise()` regrouping output by 'env' (override with `.groups` argument)
# A tibble: 6 x 3
# Groups:   env [2]
  env     year `mean(yield)`
             
1 Karnal  1932          37.5
2 Karnal  1933          43.3
3 Karnal  1934          41.9
4 Pusa    1932          29.1
5 Pusa    1933          46.9
6 Pusa    1934          52.3

看一下常规的写法,使用aggregate也可以实现:

> aggregate(yield ~ env + year, data=dat,FUN = mean)
     env year    yield
1 Karnal 1932 37.50000
2   Pusa 1932 29.06154
3 Karnal 1933 43.26154
4   Pusa 1933 46.90000
5 Karnal 1934 41.86923
6   Pusa 1934 52.31538

排序函数arrange

按照year和yield排序,默认是升序,也可以用-号降序。

> dat %>% arrange(year,yield) %>% head
     env year block gen yield
1   Pusa 1932    B5   I  15.5
2   Pusa 1932    B4   B  17.5
3   Pusa 1932    B4   A  18.0
4   Pusa 1932    B2   H  18.5
5   Pusa 1932    B4   H  18.5
6 Karnal 1932    B1   L  19.0

合并函数join

R语言对应的是merge函数,dplyr中是join函数,包括:

  • left_join # 以左边为参考合并
  • right_join  # 以右边为参考合并
  • inner_join # 以交集合并
  • full_join # 以并集合并

示例数据:

> d1 = data.frame(ID = c(1:4), y = rnorm(4))
> d2 = data.frame(ID = c(3:6), y = rnorm(4))
> d1
  ID            y
1  1 -0.006874525
2  2 -1.047489577
3  3 -1.364057715
4  4 -0.192836160
> d2
  ID          y
1  3 -1.5605263
2  4 -0.1067098
3  5  1.2367196
4  6 -0.8326215

「「left_join」」

可以看到,以d1为主,没有匹配的就为NA

> left_join(d1,d2,by="ID")
  ID          y.x        y.y
1  1 -0.006874525         NA
2  2 -1.047489577         NA
3  3 -1.364057715 -1.5605263
4  4 -0.192836160 -0.1067098

「「right_join」」

可以看到,以d2为主,没有匹配的为NA

> right_join(d1,d2,by="ID")
  ID        y.x        y.y
1  3 -1.3640577 -1.5605263
2  4 -0.1928362 -0.1067098
3  5         NA  1.2367196
4  6         NA -0.8326215

「「inner_join」」

合并两者的交集

> inner_join(d1,d2,by = "ID")
  ID        y.x        y.y
1  3 -1.3640577 -1.5605263
2  4 -0.1928362 -0.1067098

「「full_join」」

合并两者的并集

> full_join(d1,d2,by = "ID")
  ID          y.x        y.y
1  1 -0.006874525         NA
2  2 -1.047489577         NA
3  3 -1.364057715 -1.5605263
4  4 -0.192836160 -0.1067098
5  5           NA  1.2367196
6  6           NA -0.8326215

本文来自微信公众号【育种数据分析之放飞自我】公众号ID:R-breeding;未经许可谢绝二次转载至其他网站。

本文为专栏作者授权科易网发表,版权归原作者所有。文章系作者个人观点,不代表科易网立场,转载请联系原作者。如有任何疑问,请联系ky@1633.com。
热门观点