R: отсутствие значения во втором столбце первой строки приводит к тому, что read.table распознает 2D-файл как 1D-файл.

У меня есть ряд фреймов данных в моей среде R, которые я прочитал следующим образом:

x <- list.files(pattern="nuc_occupancy_region"); 

for(i in seq_along(x)){
  print(x[i])
  assign(paste(x[i]), read.table(x[i], sep='\t', header=T, fill=T))
}

ESC=ls()[grep(ls(), pattern='ESC_nuc')]
MEF=ls()[grep(ls(), pattern='MEF_nuc')]

В списке файлов MEF часто отсутствуют данные: например.

из командной строки

head MEF_nuc_occupancy_regionCybb9049012-9053217chrX.txt
9049012 26
9049013 
9049014 29
9049015 
9049016 26
etc.

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

Однако в других отсутствует второе значение первой строки....

117755994   
117755995   
117755996   
117755997   6
117755998   6
117755999   6

поэтому, несмотря на то, что каждый файл имеет 2 столбца, отсутствие второго значения в первой строке некоторых из них приводит к тому, что они распознаются как файл с одним столбцом:

read.table(example.txt, sep='\t', header=T, fill=T)

117755994   
117755995   
117755996
117755997
6
117755998
6
117755999
6

Есть ли способ избежать этого, так как мне нужно, чтобы все кадры данных были в 2D? Спасибо


person which_command    schedule 30.04.2017    source источник
comment
Звучит как потребность в 'drop=FALSE'   -  person IRTFM    schedule 30.04.2017
comment
Может попробовать без указания sep = '\t'? Когда я запускаю read.table над текстом во втором блоке кода с header = FALSE, fill = TRUE и ничего о разделителе, я получаю желаемый результат.   -  person ulfelder    schedule 30.04.2017
comment
Если файлы все одинаковые с столбцами одинаковой длины, посмотрите read_fwf в пакете readr (или tidyverse)   -  person Andrew Lavers    schedule 30.04.2017


Ответы (1)


Мне пришлось просто разобраться с python, поскольку 'readlines()' не привязан к номеру столбца:

import os
list=os.listdir('.')
counter=0
files=[]
for i in list:
    file=open(i, 'r')
    print file
    lines=file.readlines()
    file.close()
    corrected=open(i+'formatted', 'a')
    print lines[0:9]
    for line in lines:
        line=line.rstrip('\n')
        line=line.split()
        if len(line)<2:
            line.append(0)
            corrected.write("{}\t{}\n".format(line[0], line[1]))
        else:
            corrected.write("{}\t{}\n".format(line[0], line[1]))
    corrected.close()
person which_command    schedule 30.04.2017