4

所以,我下载了一个包含 900 个 txt 文件的数据集,每个生物样本一个。我想要做的是将所有这些数据合并到 R 中的一个数据矩阵中。

txt_files = list.files()

# read txt files into a list 
for (i in length(txt_files)){
  x <- read.table(file=txt_files[i], sep="\t", header=TRUE, row.name=1)
}

所有文件都在一个文件夹中,因此我使用list.files()查询所有文件名。然后我想将每个表读入一个单独的 R 对象(在这种情况下称为 x )。问题是我想用实际文件的名称而不是 x 来命名每个对象。

我尝试了几件事并尝试搜索互联网,但尚未找到解决方案。我确实发现的一件事是使用 lapply 将它们全部导入数据列表。

data_list = lapply(txt_files, read.table, sep = "\t")

但是,我认为这不适合我,因为在此之后数据矩阵不再可用。我希望有一个人可以帮助我。

4

3 回答 3

6

命名连接的(尤其是顺序的)事物通常是一件坏事。接下来你要做的是循环这些东西,这意味着通过将位粘贴在一起来构造名称。一团糟。

尽可能将事物存储在列表中。你已经做到了。我创建了一些 CSV 文件:

> txt_files=c("f1.txt","f2.txt","f3.txt","f4.txt","f5.txt")
> data_list = lapply(txt_files, read.table, sep = ",")
> data_list[[1]]
  V1 V2 V3
1  1  2  3
> data_list[[3]]
  V1 V2 V3
1  1  2  3
2  5  4  3
3  1  2  3

所以现在我可以遍历它们for(i in 1:length(txt_files))并获取文件的名称,txt_files[i]依此类推:

> for(i in 1:length(txt_files)){
+ cat("File is ",txt_files[i],"\n")
+ print(summary(data_list[[i]]))
+ }

File is  f1.txt 
       V1          V2          V3   
 Min.   :1   Min.   :2   Min.   :3  
 1st Qu.:1   1st Qu.:2   1st Qu.:3  
 Median :1   Median :2   Median :3  
 Mean   :1   Mean   :2   Mean   :3  
 3rd Qu.:1   3rd Qu.:2   3rd Qu.:3  
 Max.   :1   Max.   :2   Max.   :3  
File is  f2.txt 
       V1          V2          V3   
 Min.   :1   Min.   :2   Min.   :3  
 1st Qu.:1   1st Qu.:2   1st Qu.:3  
 Median :1   Median :2   Median :3  
 Mean   :1   Mean   :2   Mean   :3  
 3rd Qu.:1   3rd Qu.:2   3rd Qu.:3  
 Max.   :1   Max.   :2   Max.   :3  
 ...

[ETC]

于 2012-12-20T12:22:20.470 回答
3

你可以这样做:

names(data_list) <- txt_files

也许:

names(data_list) <- basename(txt_files)

或者也许使用sapply而不是lapply.

于 2012-12-20T12:17:23.403 回答
1

在没有看到您的数据的情况下,assign可能会通过以下方式应用:

txt_files = list.files()

# read txt files into a list 
for (i in length(txt_files)){
  x <- read.table(file=txt_files[i], sep="\t", header=TRUE, row.name=1)
  assign(paste(txt_files[i], "name", sep="."), x)
}

您也可以使用get回调每个创建的对象:

x <- get(paste(txt_files[i], "name", sep="."))
于 2012-12-20T12:30:08.003 回答