2015-11-24 2 views
0

Я читаю один разделитель разделов, который является матрицей, используя следующий код.Как читать отдельный файл в формате R?

infile <- file("line.txt", "r") 
readLines(infile) -> matrix 

Я не могу использовать read.table(), как число столбцов не являются одинаковыми во всех строках.

Входные данные:

position SNP rs11828013 rs7931369 rs567411332 rs184532784 rs7931583 rs555937772 rs9651750 rs9651751 rs9651752 rs73530502 
71278426 rs11828013 rs11828013 
71278461 rs7931369 - rs7931369 
71278482 rs567411332 - - rs567411332 
71278519 rs184532784 - - - rs184532784 
71278580 rs7931583 - 1.000 - - rs7931583 
71278733 rs555937772 - - - - - rs555937772 
71278792 rs9651750 - 1.000 - - 1.000 - rs9651750 
71278828 rs9651751 - 1.000 - - 1.000 - 1.000 rs9651751 
71278915 rs9651752 - 1.000 - - 1.000 - 1.000 1.000 rs9651752 
71279052 rs73530502 - 0.116 - - 0.116 - 0.116 0.116 0.116 rs73530502 
+0

Использовать read.delim? Трудно отлаживать, не видя, как выглядят ваши исходные данные. – Heroka

+1

Я не знаю, что любой мог бы дать разумный ответ на этот вопрос, не зная, как вы хотите обрабатывать разницу в количестве столбцов между строками. – Benjamin

+0

Кроме того, если вы действительно этого хотели, вы могли бы написать некоторый вариант цикла, который бы использовал 'read.table' с аргументами' skip' и 'nrows' для чтения одной строки за раз и хранения каждого результата в элементе списка. Но опять же, что вы там делаете? – Benjamin

ответ

3

С:

read.table(file="line.txt", na.strings = "-", 
      header=TRUE, stringsAsFactors=FALSE, fill=TRUE) 

где "line.txt" имя, которое вы дали вашему табуляцией текстовый файл.

Использование fill=TRUE для обеспечения неполных линий, от ?read.table:

заполнить логический. Если TRUE, то в случае, если строки имеют неодинаковую длину, пустые поля неявно добавляется

na.strings персонаж вектор строк, которые должны быть интерпретированы в качестве значений NA. Пустые поля также считаются отсутствующими значениями в логических, целочисленных, числовых и сложных полях.

Чтобы использовать ввод пробы, вместо того, чтобы использовать file="line.txt", я просто делаю:

x <- 
read.table(text=' 
position SNP rs11828013 rs7931369 rs567411332 rs184532784 rs7931583 rs555937772 rs9651750 rs9651751 rs9651752 rs73530502 
71278426 rs11828013 rs11828013 
71278461 rs7931369 - rs7931369 
71278482 rs567411332 - - rs567411332 
71278519 rs184532784 - - - rs184532784 
71278580 rs7931583 - 1.000 - - rs7931583 
71278733 rs555937772 - - - - - rs555937772 
71278792 rs9651750 - 1.000 - - 1.000 - rs9651750 
71278828 rs9651751 - 1.000 - - 1.000 - 1.000 rs9651751 
71278915 rs9651752 - 1.000 - - 1.000 - 1.000 1.000 rs9651752 
71279052 rs73530502 - 0.116 - - 0.116 - 0.116 0.116 0.116 rs73530502 
',na.strings='-', header=TRUE, stringsAsFactors = FALSE, fill=TRUE) 

Чтобы превратить это обратно в нижнюю треугольную матрицу, вы можете сделать:

x[,1] <- NULL 
rownames <- x[,1] 
x <- sapply(x[,-1], as.numeric) 
rownames(x) <- rownames 
x 

, которая возвращает матрицу:

  rs11828013 rs7931369 rs567411332 rs184532784 rs7931583 rs555937772 rs9651750 rs9651751 rs9651752 rs73530502 
rs11828013   NA  NA   NA   NA  NA   NA  NA  NA  NA   NA 
rs7931369   NA  NA   NA   NA  NA   NA  NA  NA  NA   NA 
rs567411332   NA  NA   NA   NA  NA   NA  NA  NA  NA   NA 
rs184532784   NA  NA   NA   NA  NA   NA  NA  NA  NA   NA 
rs7931583   NA  1.000   NA   NA  NA   NA  NA  NA  NA   NA 
rs555937772   NA  NA   NA   NA  NA   NA  NA  NA  NA   NA 
rs9651750   NA  1.000   NA   NA  1.000   NA  NA  NA  NA   NA 
rs9651751   NA  1.000   NA   NA  1.000   NA  1.000  NA  NA   NA 
rs9651752   NA  1.000   NA   NA  1.000   NA  1.000  1.000  NA   NA 
rs73530502   NA  0.116   NA   NA  0.116   NA  0.116  0.116  0.116   NA 
+1

Ничего себе. Я явно недостаточно читал документацию. Я никогда не замечал «fill». – Benjamin

+0

Извините, когда я прочитал из файла, я не получаю желаемого результата. – logicstar

+0

@logicstar, каков ваш желаемый результат? отредактируйте свой вопрос! – C8H10N4O2

0

Добавить sep = "\ t" на read.table()

data <- read.table(file="line.txt", na.strings = "-", sep = "\t", 
header=TRUE, stringsAsFactors=FALSE, fill=TRUE) 
+0

В этом случае это не обязательно. check '? read.table'' Если sep = "" (по умолчанию для read.table), разделителем является «пустое пространство», то есть одно или несколько пробелов, вкладки, новые строки или возврат каретки'. – C8H10N4O2

Смежные вопросы