楼主: xghehe
7219 6

[程序分享] R语言 如何批量读取多个“*.csv”表格,批量重命名这些表格的第一列,并对第一列数据 [推广有奖]

  • 0关注
  • 0粉丝

学前班

50%

还不是VIP/贵宾

-

威望
0
论坛币
30 个
通用积分
31.6124
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
1 小时
注册时间
2022-1-16
最后登录
2022-1-23

楼主
xghehe 发表于 2022-1-16 16:52:55 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

问题背景:我需要处理“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循环里调取已经批量读取的数据表,才能继续进行下一步操作,可是在对这些表格进行列重命名时,就由于变量填写的不对而出错。

求解疑答惑,万分感激!

二维码

扫码加我 拉你入群

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

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

关键词:批量重命名 R语言 Desktop naive Users R语言 for循环

已有 1 人评分论坛币 收起 理由
cheetahfly + 30 精彩帖子

总评分: 论坛币 + 30   查看全部评分

沙发
szxship 发表于 2022-1-17 20:54:56
对应错误图6,改为
tmp = paste0("CellName_GenePair_", i)
colnames(get(tmp))[i] = "pair_ab"

藤椅
s609078902 发表于 2022-1-18 08:55:56
  • 路径自己修改下,pattern 参数不需要改,其他参数应该也不需要改;
  • 把 read.xlsx() 函数换成 read.csv() 函数,那么 openxlsx 包也不需要加载;
  1. library(tidyverse)
  2. library(openxlsx)

  3. f1 <- list.files("数据/test", pattern = "Ad", full.names = TRUE)
  4. f2 <- list.files("数据/test", pattern = "LC", full.names = TRUE)

  5. data <- list()

  6. for (i in seq_along(f1)) {
  7.   data[[i]] <- read.xlsx(files[i])
  8. }

  9. for(i in seq_along(f2)) {
  10.   data[[i]] <- bind_rows(data[[i]], read.xlsx(f2[i]))
  11.   data[[i]] <- distinct(data[[i]])
  12. }

  13. data <- map(data, ~ rename(.x, pair_ab = ab))
复制代码

板凳
yzz_young 发表于 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")

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

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

    7
    caimiao0714 学生认证  发表于 2022-1-22 00:34:49
    s609078902 发表于 2022-1-21 14:49
    很好的建议。我用 for 循环是因为我只是想展示我的思路,对大部分人来说 for loop 相比 map() 的可读性更 ...
    嗯呢,给你点赞。

    您需要登录后才可以回帖 登录 | 我要注册

    本版微信群
    加好友,备注cda
    拉您进交流群
    GMT+8, 2026-2-2 17:20