Сохранение верхнего левого столбца матриц в R - PullRequest
0 голосов
/ 03 мая 2018

Я написал скрипт общего назначения для усреднения «стеков» матриц по ячейкам. Я записываю усредненный файл, но ячейка, которая соответствует заголовку столбца для имен строк, в какой-то момент отбрасывается в процессе преобразования между матрицами / таблицами и т. Д.

Есть ли способ заставить R «уважать» эту ячейку (вверху слева), чтобы она сохранялась, когда я приду записать файл? Мне нужно сохранить его для другого сценария ниже.

Я думал о том, чтобы просто «вставить» ячейку обратно во время записи, но это кажется грязным, и если я хочу, чтобы это было обобщено, мне пришлось бы добавить аргумент в argparse. До сих пор я только смог определить параметр header = T/F, равный write.table, но, похоже, он не предлагает ничего дополнительного для верхнего левого столбца.

Вот код:

# 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 голосов
/ 03 мая 2018

Я подозреваю, что ваша проблема на этапе 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)
...