read.csv, заголовок в первой строке, пропустить вторую строку

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

data <- read.csv("HK Stocks bbg.csv", header = T, stringsAsFactors = FALSE)

Первая строка становится заголовком, а вторая строка файла становится первой строкой моего фрейма данных:

  Xaaaaaaaaa       X X.1     Xbbbbbbbbbb     X.2 X.3
1         Date PX_LAST  NA         Date PX_LAST  NA
2   31/12/2002  38.855  NA   31/12/2002  19.547  NA
3   02/01/2003  38.664  NA   02/01/2003  19.547  NA
4   03/01/2003  40.386  NA   03/01/2003  19.547  NA
5   06/01/2003  40.386  NA   06/01/2003  19.609  NA
6   07/01/2003  40.195  NA   07/01/2003  19.609  NA

Я хочу пропустить эту вторую строку файла CSV и просто получить

  X1.HK.Equity       X X.1 X2.HK.Equity     X.2 X.3
2   31/12/2002  38.855  NA   31/12/2002  19.547  NA
3   02/01/2003  38.664  NA   02/01/2003  19.547  NA
4   03/01/2003  40.386  NA   03/01/2003  19.547  NA
5   06/01/2003  40.386  NA   06/01/2003  19.609  NA
6   07/01/2003  40.195  NA   07/01/2003  19.609  NA

Я пробовал data <- read.csv("HK Stocks bbg.csv", header = T, stringsAsFactors = FALSE, skip = 1), но это возвращает:

        Date PX_LAST  X     Date.1 PX_LAST.1 X.1
1 31/12/2002  38.855 NA 31/12/2002    19.547  NA
2 02/01/2003  38.664 NA 02/01/2003    19.547  NA
3 03/01/2003  40.386 NA 03/01/2003    19.547  NA
4 06/01/2003  40.386 NA 06/01/2003    19.609  NA
5 07/01/2003  40.195 NA 07/01/2003    19.609  NA
6 08/01/2003  40.386 NA 08/01/2003    19.547  NA

Строка заголовка взята из второй строки моего CSV-файла, а не из первой.

Спасибо.


person mchangun    schedule 07.04.2013    source источник
comment
Вы можете попробовать двухэтапный подход. Прочитайте данные, начиная с 3-й строки без заголовка на первом шаге. Считайте только первую строку как вектор символов, а затем добавьте вектор символов как имена для данных.   -  person djhurio    schedule 07.04.2013
comment
Я проверил ваш код, и эта строка у меня работает: df ‹- read.csv(fname, header = T, stringsAsFactors = FALSE, skip = 1)   -  person Andrii    schedule 02.10.2017
comment
Я смущен, почему этот вопрос помечен как дубликат вопроса, который был задан год спустя, не должно ли быть наоборот?   -  person Adrian Tompkins    schedule 07.06.2020


Ответы (3)


Это должно помочь:

all_content = readLines("file.csv")
skip_second = all_content[-2]
dat = read.csv(textConnection(skip_second), header = TRUE, stringsAsFactors = FALSE)

Первый шаг с использованием readLines считывает весь файл в список, где каждый элемент списка представляет собой строку в файле. Затем вы отбрасываете вторую строку, используя тот факт, что отрицательное индексирование в R означает select all but this index. Наконец, мы передаем эти данные в read.csv для обработки в data.frame.

person Paul Hiemstra    schedule 07.04.2013
comment
Спасибо за ваш ответ. Последняя строка dat = read.csv(skip_second, header = TRUE, stringsAsFactors = FALSE) выдает ошибку Error in file(file, "rt") : invalid 'description' argument. Как я могу заставить read.csv принимать переменную вместо пути к файлу? - person mchangun; 07.04.2013
comment
Используйте textConnection дополнительно. - person Paul Hiemstra; 07.04.2013
comment
По словам Пола, этот подход блестяще работал с файлами меньшего размера (менее 5 МБ), но с большими файлами возникали проблемы. Я задал вопрос об этом и дал ответ после того, как он хорошо работал с большими файлами здесь: stackoverflow.com/questions/24921387/ - person Nathaniel Payne; 24.07.2014

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

df<-read.csv("test.txt",header=T)[-1,]

если мой файл данных "test.txt" выглядит следующим образом:

var1, var2
units1, units2
2.3,6.8
4.5,6.7

это дает мне

> read.csv("test.txt",header=T)[-1,]
var1 var2
2  2.3  6.8
3  4.5  6.7

Это точно отвечает на ваш вопрос, но просто для обобщения ответа вы также можете пропустить строки с N с M следующим образом:

df<-read.csv("test.txt",header=T)[-N:-M,]

где N и M, конечно, целые числа.


Примечание. Этот метод преобразует все столбцы в фактор.

str(read.csv("test.csv", header = TRUE)[-1,])
# 'data.frame': 2 obs. of  2 variables:
#   $ var1: Factor w/ 3 levels "2.3","4.5","units1": 1 2
#   $ var2: Factor w/ 3 levels " units2","6.7",..: 3 2
person Adrian Tompkins    schedule 29.09.2017

В Linux (или Mac) вы можете воспользоваться возможностью использовать команды Linux в data.table::fread, поэтому

data.table::fread("sed -e '2d' myfile.txt", data.table = F)

пропустит вторую строку.

person daknowles    schedule 10.10.2018