2014-10-20 4 views
6

Я хочу импортировать CSV-файлы в R, с первой непустой строкой, снабжающей имена столбцов фрейма данных. Я знаю, что вы можете указать аргумент skip = 0, чтобы указать, какую строку читать первым. Тем не менее, номер строки первой непустой строки может меняться между файлами.Пропустить все ведущие пустые строки в read.csv

Как определить, сколько строк пуст, и динамически пропускать их для каждого файла?

Как указано в комментариях, мне необходимо уточнить, что означает «пустое». Мои файлы csv выглядят так:

,,, 
w,x,y,z 
a,b,5,c 
a,b,5,c 
a,b,5,c 
a,b,4,c 
a,b,4,c 
a,b,4,c 

, что означает, что в начале есть запятые.

ответ

7

read.csv автоматически пропускает пустые строки (если не установлено blank.lines.skip=FALSE). См. ?read.csv

После написания выше, плакат объяснил, что пустые строки на самом деле пустые, но в них есть запятые, но между запятыми нет ничего. В этом случае используйте fread из пакета data.table, который будет обрабатывать это. skip= аргумента может быть установлен в любом символьной строки, найденной в заголовке:

library(data.table) 
DT <- fread("myfile.csv", skip = "w") # assuming w is in the header 
DF <- as.data.frame(DT) 

Последняя строка может быть опущен, если data.table в порядке, а возвращаемое значение.

+1

Хороший улов. До тех пор, пока «пустые» строки полностью пусты от любых символов, это должно работать. OP, вероятно, должен уточнить характер их данных. – thelatemail

+0

Я попытался использовать 'blank.lines.skip = TRUE', и мне было интересно, почему это не сработало. Оказывается, пустые строки содержат запятые. – Alex

+0

Есть ли минус пропускания пустых строк в исполнении? - У меня есть каждая вторая строка, пустая в моей попытке, на самом деле каждая нечетная строка пуста. - Мне нравится сохранять данные как можно более оригинальными. –

2

В зависимости от размера вашего файла это может быть не лучшее решение, но оно выполнит эту работу.

Стратегия здесь, вместо чтения файла с разделителем, будет читать строки, и считать символы и хранить в темпе. Затем цикл while будет искать первую ненулевую длину символа в списке, затем прочитает файл и сохранит его как data_filename.

flist = list.files() 
for (onefile in flist) { 
    temp = nchar(readLines(onefile)) 
    i = 1 
    while (temp[i] == 0) { 
    i = i + 1 
    } 
    temp = read.table(onefile, sep = ",", skip = (i-1)) 
    assign(paste0(data, onefile), temp) 
} 

Если файл содержит заголовки, вы можете начать я из 2.

2

Если первая пара пустых строк действительно пуста, то read.csv должен автоматически перейти к первой строке. Если у них есть запятые, но нет значения, то вы можете использовать:

df = read.csv(file = 'd.csv') 
df = read.csv(file = 'd.csv',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1])) 

Это не эффективно, если у вас есть большие файлы (так как вы должны импортировать в два раза), но это работает.

Если вы хотите импортировать файл с разделителями табуляции с одной и той же задачи (переменная пустые строки), а затем использовать:

df = read.table(file = 'd.txt',sep='\t') 
df = read.table(file = 'd.txt',skip = as.numeric(rownames(df[which(df[,1]!=''),])[1])) 
+0

Точка с запятыми, но это также будет работать с вкладкой, разделенной так же хорошо? – Alex

+0

Не с функцией 'read.csv'. Вы получите ошибку, так как функция ищет запятые. – CephBirk

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