全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
7218 6
2022-01-16

问题背景:我需要处理“test”文件夹里的20个表格,其中肺癌(LC)表格10个,癌旁(Adjac)表格10个,也就是10对表格,如图1。

图1.png

图1

每个表格的第一列(列名为“ab”)是很多基因名称,如图2。

图2.png

图2

需求或想实现的目标:

1、我想批量读取这20个表格;

2、重命名20个表格的第一列,也就是将“ab”改为“pair_ab”;

3、将相同细胞所在表格(例如:Adjac_1-CD8-Naive-T.csv和LC_1-CD8-Naive-T.csv这一对表格,如图3)的第一列合并、去除重复、保存为新表格;

图3.png

图3

尝试一、以第一对表格进行试验处理,代码如下:

1.  #设置工作目录,注意不要有汉字和中文符号2.  setwd("C:\\Users\\iCPU\\Desktop\\test")3.  #读取基因对表格4.  #5.  LC_1_CD8_Naive_T_GenePair <- read.csv("LC_1-CD8-Naive-T.csv")6.  colnames(LC_1_CD8_Naive_T_GenePair)[1] <- "pair_ab"7.  #癌旁8.  Adjac_1_CD8_Naive_T_GenePair <- read.csv("Adjac_1-CD8-Naive-T.csv")9.  colnames(Adjac_1_CD8_Naive_T_GenePair)[1] <- "pair_ab"10.    11.   #合并癌和癌旁的基因对,取并集,重复的基因对只保留一个12.   Total_1_CD8_Naive_T_GenePair <- data.frame(union(LC_1_CD8_Naive_T_GenePair$pair_ab, Adjac_1_CD8_Naive_T_GenePair$pair_ab))13.   colnames(Total_1_CD8_Naive_T_GenePair)[1] <- "GenePair"14.   write.csv(Total_1_CD8_Naive_T_GenePair, "Total_1_CD8_Naive_T_GenePair.csv", row.names = FALSE)15.   #成功

第一对表格运行成功,如图4、5:

图4.png

图4

图5.png

图5

尝试二、批量读取这20个(10对)表格,用到了for循环,注意仅仅只能够批量读取表格,不能区分癌LC和癌旁Adjac,代码如下:

1.  #将当前文件夹“test”里的文件名都放入变量“CellName_csv”2.  CellName_csv <- dir()3.  #建立for循环用于批量读取数据表4.  for (i in 1:length(CellName_csv)) {5.    assign(paste0("CellName_GenePair_", i), read.csv(CellName_csv))6.  }7.  #由此成功读取了20个表格,分别是CellName_GenePair_1CellName_GenePair_2...... CellName_GenePair_20

我无法实现的内容:
1
、我不能在上面for循环的代码里,批量对已经读取的表格第一列列名进行重命名,代码如下:

1.  #建立for循环用于批量读取数据表、批量重命名所有表格的第一列2.  for (i in 1:length(CellName_csv)) {3.    assign(paste0("CellName_GenePair_", i), read.csv(CellName_csv))4.    colnames(CellName_GenePair_i)[1] <- “pair_ab” #对应错误图65.    #colnames(paste0("CellName_GenePair_", i))[1] <- "pair_ab"  #对应错误图76.    #colnames(CellName_GenePair_))[1] <- "pair_ab"  #对应错误图87.  }8.  

错误截图(或):

图6.png

图6

图7.png

图7

图8.png

图8

2、既然不能用for循环批量重命名所有表格第一列,那也无法合并每一对表格,去重复、以及保存。

总结:我不知道在for循环中,如何正确地输入数据表变量:CellName_GenePair_i,然后对这20个表格进行批量的,我想要的常规操作。另外,我其实需要处理不止20个表格,而是2000个表格,每个表格里基因名称也有20384个,但只有先知道如何在for循环里调取已经批量读取的数据表,才能继续进行下一步操作,可是在对这些表格进行列重命名时,就由于变量填写的不对而出错。

求解疑答惑,万分感激!

附件列表
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2022-1-17 20:54:56
对应错误图6,改为
tmp = paste0("CellName_GenePair_", i)
colnames(get(tmp))[i] = "pair_ab"
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2022-1-18 08:55:56
  • 路径自己修改下,pattern 参数不需要改,其他参数应该也不需要改;
  • 把 read.xlsx() 函数换成 read.csv() 函数,那么 openxlsx 包也不需要加载;
复制代码

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2022-1-18 13:23:12
读取并合并特定目录下的多个csv

library(plyr) # load plyr packages
listnames <- list.files(pattern='.csv') # creat a list for all .csv files in working directory
pp1 <- ldply(listnames,read.csv,header=T) #put all the files in a data.frame
write.csv(pp1, "all_countries_data.csv")
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2022-1-21 14:38:53
s609078902 发表于 2022-1-18 08:55
  • 路径自己修改下,pattern 参数不需要改,其他参数应该也不需要改;
  • 把 read.xlsx() 函数换成 read ...
  • 这里的`for`循环是不是可以直接用`map_dfr()`代替?为啥要用两个循环?
    二维码

    扫码加我 拉你入群

    请注明:姓名-公司-职位

    以便审核进群资格,未注明则拒绝

    2022-1-21 14:49:44
    caimiao0714 发表于 2022-1-21 14:38
    这里的`for`循环是不是可以直接用`map_dfr()`代替?为啥要用两个循环?
    很好的建议。我用 for 循环是因为我只是想展示我的思路,对大部分人来说 for loop 相比 map() 的可读性更好
    二维码

    扫码加我 拉你入群

    请注明:姓名-公司-职位

    以便审核进群资格,未注明则拒绝

    点击查看更多内容…
    相关推荐
    栏目导航
    热门文章
    推荐文章

    分享

    扫码加好友,拉您进群