因为之前总是在处理表格数据时不熟悉操作,浪费很多时间。所以就抽出时间做了一个学习笔记,内容基本涵盖目前处理任务所需要的功能,后期如果还是遇到什么问题会继续更新学习笔记。

先上一下我们的示例数据:

library(dplyr)

>gset = eset2[1:4,1:4] %>% as.data.frame()
>gset
      GSM387788 GSM387789 GSM387790 GSM387791
DDR1  2846.2456 4195.5971 6127.7787 2011.1505
RFC2   214.0745  750.9918  293.8308  705.4816
HSPA6  174.6565  243.5546  367.7806  264.7895
PAX8   285.2702  112.8286  365.4212  218.1675

一、创建

这里的创建是很基本的操作,但为了完整我仍是处理一下。

>cluster = data.frame(cluster = c(1,2,3),species = c("human","mice","bee"))
  cluster species
1       1   human
2       2    mice
3       3     bee

这个在后面会用到,先暂时跳过。

二、增加列/行

> #增加一列
> gene_id = c("WNT","SDE-1","SQE","HAHD")
> gset = cbind(gset,gene_id)
> gset
      GSM387788 GSM387789 GSM387790 GSM387791 gene_id
DDR1  2846.2456 4195.5971 6127.7787 2011.1505     WNT
RFC2   214.0745  750.9918  293.8308  705.4816   SDE-1
HSPA6  174.6565  243.5546  367.7806  264.7895     SQE
PAX8   285.2702  112.8286  365.4212  218.1675    HAHD

> #增加一行
> gset = rbind(gset,gene_id)
        GSM387788   GSM387789   GSM387790   GSM387791 gene_id
DDR1  2846.245575   4195.5971 6127.778675  2011.15045     WNT
RFC2    214.07445   750.99185    293.8308   705.48165   SDE-1
HSPA6    174.6565    243.5546   367.78055    264.7895     SQE
PAX8     285.2702 112.8285875 365.4211625 218.1675375    HAHD
5             WNT       SDE-1         SQE        HAHD     WNT

> #修改行名
> rownames(gset)[5] = "HSH"       #而非rownames(gset[5,]) = "HSH"
        GSM387788   GSM387789   GSM387790   GSM387791 gene_id
DDR1  2846.245575   4195.5971 6127.778675  2011.15045     WNT
RFC2    214.07445   750.99185    293.8308   705.48165   SDE-1
HSPA6    174.6565    243.5546   367.78055    264.7895     SQE
PAX8     285.2702 112.8285875 365.4211625 218.1675375    HAHD
HSH           WNT       SDE-1         SQE        HAHD     WNT

> #修改指定行名(其他方法)
> ###错误
> rownames(gset)["DDR1"] = "DDR" 
Error in `.rowNamesDF<-`(x, value = value) : 'row.names'的长度不对
> ###正确
> a = grep("DDR1",rownames(gset))     
> rownames(gset)[a] = "DDR"
> #修改列名(同修改行名),但可以用dplyr函数
> dplyr::rename(gset,ID = gene_id)
      GSM387788 GSM387789 GSM387790 GSM387791    ID      count
DDR   2846.2456 4195.5971 6127.7787 2011.1505   WNT 15180.7718
RFC2   214.0745  750.9918  293.8308  705.4816 SDE-1  1964.3787
HSPA6  174.6565  243.5546  367.7806  264.7895   SQE  1050.7811
PAX8   285.2702  112.8286  365.4212  218.1675  HAHD   981.6875

dplyr包内的mutate()函数

若要增加新的一列,是有很多方法的,除了上述代码块内的基本方法,

还可以使用gset$gene_id = c() 的方法,这里讲一种我之前不知道的mutate()

#使用dplyr中的mutate()
>gset = mutate(gset,count = GSM387788+GSM387789+GSM387790+GSM387791)
 GSM387788 GSM387789 GSM387790 GSM387791 gene_id      count
DDR1  2846.2456 4195.5971 6127.7787 2011.1505     WNT 15180.7718
RFC2   214.0745  750.9918  293.8308  705.4816   SDE-1  1964.3787
HSPA6  174.6565  243.5546  367.7806  264.7895     SQE  1050.7811
PAX8   285.2702  112.8286  365.4212  218.1675    HAHD   981.6875

#这里其实应该有不用全部列名都打出来才能求和的方法,暂时没想到,先这样

三、删除

这个很普通了:gset = gset[-5,]

意思是删除第五行。

四、重复、排序和整理(order)

> #重复————————replicate()
> replicated = gset[rep(1:2,each = 2),]     #最好是用来复制多行数据,因为他会替换
> replicated
       GSM387788 GSM387789 GSM387790 GSM387791 gene_id     count
DDR    2846.2456 4195.5971 6127.7787 2011.1505     WNT 15180.772
DDR.1  2846.2456 4195.5971 6127.7787 2011.1505     WNT 15180.772
RFC2    214.0745  750.9918  293.8308  705.4816   SDE-1  1964.379
RFC2.1  214.0745  750.9918  293.8308  705.4816   SDE-1  1964.379

> double = gset[c(1:3,1:4),]              #用于指定重复,下为原理
> #> c(1:3,1:4)
> # [1] 1 2 3 1 2 3 4
> double = double[order(rownames(double)),]  #可以使用order()使复制的行并排
> double
        GSM387788 GSM387789 GSM387790 GSM387791 gene_id      count
DDR     2846.2456 4195.5971 6127.7787 2011.1505     WNT 15180.7718
DDR.1   2846.2456 4195.5971 6127.7787 2011.1505     WNT 15180.7718
HSPA6    174.6565  243.5546  367.7806  264.7895     SQE  1050.7811
HSPA6.1  174.6565  243.5546  367.7806  264.7895     SQE  1050.7811
PAX8     285.2702  112.8286  365.4212  218.1675    HAHD   981.6875
RFC2     214.0745  750.9918  293.8308  705.4816   SDE-1  1964.3787
RFC2.1   214.0745  750.9918  293.8308  705.4816   SDE-1  1964.3787


> #去重——去除重复的行——————distinct()
> distinct(double)
      GSM387788 GSM387789 GSM387790 GSM387791 gene_id      count
DDR   2846.2456 4195.5971 6127.7787 2011.1505     WNT 15180.7718
HSPA6  174.6565  243.5546  367.7806  264.7895     SQE  1050.7811
PAX8   285.2702  112.8286  365.4212  218.1675    HAHD   981.6875
RFC2   214.0745  750.9918  293.8308  705.4816   SDE-1  1964.3787
>

排序则使用arrange()

arrange(.data,...) 省略号的意思是以何为排序。若选择多个向量,则有先后顺序之分。若要倒序用arrange(gset,desc(count))

五、分组,有点像归类之意

group_by():以什么分组

summarise():总结

filter():筛选出你所分组、且符合你所要求条件的完整数据(注:filter内是用"==",因为是要等价赋值的,并不是给一个向量)

三者多合用

> #分组
> gset_1 = gset         #单独列出个dataframe,不要随便在测试集上操作
> gset_1$cluster = c(1,2,1,3)        #添加一列分类信息
> #group_by  and  summarise 
> gset_1 %>% group_by(cluster) %>% summarise(max = max(count))
# A tibble: 3 x 2
  cluster    max
    <dbl>  <dbl>
1       1 15181.
2       2  1964.
3       3   982.
> #group_by  und  filter
> gset_1 %>% group_by(cluster) %>% filter(count == max(count))
# A tibble: 3 x 7
# Groups:   cluster [3]
  GSM387788 GSM387789 GSM387790 GSM387791 gene_id  count cluster
      <dbl>     <dbl>     <dbl>     <dbl> <chr>    <dbl>   <dbl>
1     2846.     4196.     6128.     2011. WNT     15181.       1
2      214.      751.      294.      705. SDE-1    1964.       2
3      285.      113.      365.      218. HAHD      982.       3

六、dplyr包内其他函数的使用

这里只讲一个left_join(),因为经常有需要交集合并列表的情况,inner_join()也常用

>cluster = data.frame(cluster = c(1,2,3),species = c("human","mice","bee"))
#还记得这个创建表格么,这就是我在后面用来测试用的
> cluster
  cluster species
1       1   human
2       2    mice
3       3     bee


#研究left_join效果
>left_join(cluster,gset_1,by = "cluster")
  cluster species GSM387788 GSM387789 GSM387790 GSM387791 gene_id      count
1       1   human 2846.2456 4195.5971 6127.7787 2011.1505     WNT 15180.7718
2       1   human  174.6565  243.5546  367.7806  264.7895     SQE  1050.7811
3       2    mice  214.0745  750.9918  293.8308  705.4816   SDE-1  1964.3787
4       3     bee  285.2702  112.8286  365.4212  218.1675    HAHD   981.6875

>left_join(gset_1,cluster,by = "cluster")      #结论:并无区别,只是谁在左谁在右
 GSM387788 GSM387789 GSM387790 GSM387791 gene_id      count cluster species
1 2846.2456 4195.5971 6127.7787 2011.1505     WNT 15180.7718       1   human
2  214.0745  750.9918  293.8308  705.4816   SDE-1  1964.3787       2    mice
3  174.6565  243.5546  367.7806  264.7895     SQE  1050.7811       1   human
4  285.2702  112.8286  365.4212  218.1675    HAHD   981.6875       3     bee

以上,这就是2021/12/13日的学习笔记,很浅的总结了一下dataframe的基本操作。因为之前长时间不上机就会忘记,于是乎打算在博客上记录笔记,以便随时查阅。这都是很简单的操作。我认真的!公布这篇文章时我还怕有专业人士取笑,但后来想想没关系:这都是学习的过程。看到别人很努力的学习打排球却不免笨拙生手的时候,我也没有嘲笑,反而是觉得他很努力。谁会嘲笑一个努力的人呢?

但其实我很多也是观看别人博客学习的,代码就是个学习和模仿最终熟能生巧的过程。为了防止从入门到劝退,产出点实质性笔记是很好的正反馈。大家加油吧!

当然了博客不是常常更新,我还是要多以自己为重,这样才能学到东西吧!