我有一堆文件,我正在一个数据框中合并。文件名如下: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."
关于导致这种情况的原因的任何解释都会有所帮助,因为我需要在以后使用其他文件更改这些名称。
答案 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_join
和purrr::reduce
将它们依次加入。
尽管很久以前就问过这个问题,但是这种类型的任务很常见,所以我认为基于整洁的答案仍然有用。 (而且它仍在“未投票解决的问题”过滤器中。)