在R中保留左上角的矩阵列

时间:2018-05-03 13:36:47

标签: r matrix read.table write.table

我已经编写了一个通用脚本来平均'堆栈'基于细胞方式的矩阵我写出了平均文件,但是在矩阵/表格等转换过程中的某个时刻,丢弃了与行名称列标题对应的单元格。

有没有办法让R'尊重'这个单元格(左上角),以便在我写出文件时它会持续存在?我需要将它保存在下游的另一个脚本中。

我想过只是注射'这个单元格在写入时返回,但是感觉很乱,如果我希望将其推广,我必须在argparse中添加一个参数。到目前为止,我只能找到header = T/F write.table的{​​{1}}选项,但这似乎不会为左上方列提供额外的内容。

以下是代码:

# Standard install if missing
list.of.packages <- c("argparse", "abind")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)
for(i in list.of.packages){suppressMessages(library(i, character.only = TRUE))}


# Parse commandline arguments
parser <- ArgumentParser()
parser$add_argument('-i',
                    '--infiles',
                    nargs='+',
                    required=TRUE,
                    help="All the matrices to average.")
parser$add_argument('-s',
                    '--separator',
                    action='store',
                    default='\t',
                    help='The field separator for the input matrices (they should all match). [Def = \t].')
parser$add_argument('-o',
                    '--outfile',
                    action='store',
                    required=TRUE,
                    help='Output file to store the averaged matrix in.')

args <-parser$parse_args()

tables <- lapply(args$infiles, read.table, header=TRUE, row.names=1, check.names=FALSE, sep=args$sep)
matrices <- lapply(tables, as.matrix)
stack <- abind(matrices, along=3)
stack_avg <- apply(stack, c(1,2), mean)
# Write file
write.table(stack_avg, args$outfile, sep=args$sep, col.names = NA, quote = FALSE)
cat("File written to: ", "\n", args$outfile, "\n")

产生标题:

    Helix1  Helix2  Strand1 Strand2 Turn    Unordered
20  8   8.25    18.25   9.5 13.75   36.25
....

但是所需的输出是(忽略现在的值):

Temp    Helix1  Helix2  Strand1 Strand2 Turn    Unordered
20  2.00    4.00    21.00   11.00   19.00   43.00

示例输入矩阵可能如下所示:

Temp    Helix1  Helix2  Strand1 Strand2 Turn    Unordered
20  2.00    12.00   19.00   11.00   11.00   23.00
25  1.00    5.00    21.00   10.00   18.00   46.00
30  1.00    4.00    21.00   10.00   17.00   45.00
35  1.00    5.00    24.00   11.00   18.00   40.00
40  1.00    5.00    21.00   100.00  19.00   43.00
45  1.00    3.00    25.00   11.00   18.00   42.00
50  1.00    4.00    23.00   11.00   19.00   41.00
55  1.00    4.00    19.00   10.00   19.00   46.00
60  1.00    5.00    18.00   11.00   22.00   42.00
65  1.00    5.00    200.00  11.00   22.00   41.00
70  2.00    4.00    20.00   11.00   20.00   43.00
75  2.00    5.00    15.00   10.00   23.00   44.00
80  2.00    5.00    16.00   10.00   22.00   45.00
85  1.00    4.00    19.00   11.00   21.00   44.00
90  2.00    4.00    20.00   11.00   20.00   44.00

1 个答案:

答案 0 :(得分:1)

我怀疑你的问题出在read.table步骤。尝试做

test_table_read <- read.table('one_of_your_tables', 
                              header = TRUE, 
                              row.names = 1, 
                              check.names = FALSE,
                              sep = '\t')

并查看View(test_table_read)。我认为此时行名称的标题已经消失。

需要考虑的一些事项:

您的行名称服务的目的是什么?它们是数字的,如果是这样,它们应该在数据中而不是行名吗?

使用data.frame代替matrix

可能会更好地解决此问题 顺便说一下,我打算建议给出一个更简单,可重复的例子,但我认为这个问题确实存在于你读取外部数据的时候,这使得发布更具挑战性。但是,如果我错了,你可以用以下一组矩阵代替你自己来重现问题吗?我认为所有解析参数都与问题无关,可以在你的例子中进行编辑。

matrices <- lapply(split(mtcars, 1:4), as.matrix)