如何防止'read.table'将下划线和连字符改为点?

时间:2014-08-24 12:14:24

标签: r character read.table

我有一堆文件,我正在一个数据框中合并。文件名如下:unc.edu.b6530750-0410-43ec-bb79-f862ca3424a6.1918120.rsem.genes.results

我希望文件名是列名。我正在使用以下代码:

for (file in file_list){

  if (!exists("dataset")){
      dataset <- read.table(file, header=TRUE, colClasses = c(rep("character", 2),                     rep("NULL", 2)), col.names = c("gene_id", deparse(substitute(file)), "NuLL", "NULL"), sep="\t")
      print(deparse(substitute(file)))
    }

    if (exists("dataset")){
      temp_dataset <-read.table(file, header=TRUE, colClasses = c(rep("character", 2), rep("NULL", 2)), col.names = c("gene_id", deparse(substitute(file)), "NuLL", "NULL"), sep="\t")
      print(deparse(substitute(file)))
      dataset<-merge(dataset, temp_dataset, by = "gene_id")
      rm(temp_dataset)
    }
}

一切顺利,但列名称现在将下划线替换为点。

colnames(data)

[1] "gene_id"                                                                       
[2] "X...unc.edu.02cb8dbe.ef56.471c.b52d.41c29219fd95.1794854.rsem.genes.results..x"
[3] "X...unc.edu.02cb8dbe.ef56.471c.b52d.41c29219fd95.1794854.rsem.genes.results..y"
[4] "X...unc.edu.02f5dcba.bdcc.4424.aed4.195a8d551325.2085643.rsem.genes.results."  

关于导致这种情况的原因的任何解释都会有所帮助,因为我需要在以后使用其他文件更改这些名称。

1 个答案:

答案 0 :(得分:1)

正如@akrun在评论中所述,read.table(file, ..., check.names=FALSE)将解决当前的问题。

但是,现在有一些更整洁的方法可以使用某些tidyverse软件包来实现您想要的目的。

首先让我们加载软件包并生成一些示例数据:

library(purrr)
library(readr)
data <- c("gene_id\tresult\trandom_a\trandom_b
TNF\t1e-8\t1.7\t4.3
IL8\t0.4\t-0.3\t8.6",
"gene_id\tresult\trandom_a\trandom_b
TNF\t2.4e-7\t1.7\t4.3
IL8\t0.9\t0.8\t8.3",
"gene_id\tresult\trandom_a\trandom_b
TNSF8\t0.003\t2.1\t9.7
IL8\t0.02\t1.9\t4.6")
file_list <- sprintf("file_%d.csv", 1:3)
walk2(data, file_list, ~write_tsv(read_tsv(.x), .y))

现在这是读取和合并数据的实际位:

library(purrr)
library(readr)
library(dplyr)
dataset <- file_list %>%
  map(~read_tsv(.x, col_types = "cc__", col_names = c("gene_id", .x), skip = 1)) %>%
  reduce(full_join, by = "gene_id")

这使用map来逐个读取每个文件,跳过第一行可能是标题行以及第三和第四列,并将结果列重命名为gene_id并使用文件名。然后使用dplyr::full_joinpurrr::reduce将它们依次加入。

尽管很久以前就问过这个问题,但是这种类型的任务很常见,所以我认为基于整洁的答案仍然有用。 (而且它仍在“未投票解决的问题”过滤器中。)