2014-11-22 5 views
0

Краткая история о том, что мне нужно: Я прочитал в CSV-файле, и я хочу взять некоторые из столбцов и сохранить их в переменных как их собственный кадр данных, а затем сохраните переменные в списке. Однако, когда я использую c() для этого, он просто помещает все данные в плоский вектор. Есть ли способ иметь список кадров данных?Как сделать «списки» или «векторы» фреймов данных

Чем длиннее история: Я прочитал в файле CSV, предположим, что он выглядит как этот

,"Date","px high","px low","px last",,,,"Date","px high","px low","px last" 
"eur curncy",03/Jan/2000,1.03,1.01,1.02,,,"gbp curncy",03/Jan/2000,1.64,1.61,1.64 
,1/4/2000,1.03,1.02,1.03,,,,1/4/2000,1.64,1.63,1.64 
,1/5/2000,1.04,1.03,1.03,,,,1/5/2000,1.65,1.64,"#N/A N/A" 
,1/6/2000,1.04,1.03,1.03,,,,1/7/2000,1.65,1.64,1.65 

Когда я сохранить файл для чтения CSV и печати переменной она выглядит как

  Date  px.high px.low px.last Date.1  px.high.1 px.low px.last 
eur curncy 03/Jan/2000 1.03  1.02  1.03  03/Jan/2000 1.64   1.63  1.64 
      1/4/2000 1.03  1.02  1.03  1/4/2000  1.64   1.63  1.64 
... etc. 

Я сбрил много данных для этого примера, чтобы избежать беспорядка, но есть еще много строк и столбцов этих данных. Вдоль столбцов они повторяются в этих группах, каждая из которых имеет дату, px высокий и т. Д. По строкам вы более или менее получаете то же самое, что и в последних парах строк, показанных выше.

В конечном итоге я хочу войти в каждую группу данных, сегментировать ее в месяцах, вычислить средние значения за каждый месяц в каждом столбце и выбросить ежедневную информацию, а затем составить гистограмму для каждой группы. Однако у меня есть следующие проблемы, которые мне необходимо решить:

  1. Первая строка дат отличается от других строк в другом формате. Все строки после первой строки находятся в одном формате. Я очень хорошо это исправить себя, прочитав в данных, как

cur <- read.csv('C:\\file.csv', stringsAsFactors=FALSE)

, а затем цикл по столбцам, назначая в нужных местах

cur[1,col] <- as.character(as.date(cur[1,col], format='%d/%b/%Y'))

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

  1. Некоторые из записей в файле CSV содержат строку «# N/AN/A», которая, как я нашел, заставит R читать каждую другую запись в этом столбце как string, так что я больше не могу выполнять арифметику для объектов. Я в порядке, просто выбросив эти строки данных, которые есть на них, но даже при этом столбцы остаются строками. Кроме того, если я выброшу строку из одной из этих групп, я отброшу всю строку для всех остальных данных, которые я не хочу делать.

Арифметическая проблема легко решить, когда я делаю арифметику, я просто конвертирую все в числовое. Это может быть неэффективно, но, похоже, оно работает достаточно хорошо. Но проблема, связанная с тем, что все эти строки объединены в одном кадре данных, так что, если я выброшу одну строку, я также выброшу все остальные данные в эту строку, а иногда даты групп не совпадают. Поэтому, если я отброшу строку, которая имеет «# N/A N/A» на нем на одну дату, я буду выбрасывать другие даты для других групп, чего я не хочу. Поэтому лучшим решением, о котором я могу думать, является разделение групп на собственные кадры данных и их обработка несколько по отдельности.

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

Но если кто-то думает, что есть лучший способ пойти, дайте мне знать.

ответ

2

Чтобы ответить на ваш вопрос о списках, да, вы можете хранить кадры данных в списках:

l <- list(dat1, dat2, dat3, etc.) 

Если у вас есть нечетные NA значения (999, -1, -11, # N/A, и т.д.), вы можете использовать na.strings, чтобы поймать тех, и сохранить ваши столбцы цифр:

(dat <- read.csv(header = TRUE, na.strings = c('#N/A N/A'), 
       stringsAsFactors = FALSE, 
       text="Date,px high,px low,px last, 
03/Jan/2000,1.03,1.01,1.02, 
03/Jan/2000,1.64,1.61,1.64, 
1/4/2000,1.03,1.02,1.03, 
1/4/2000,1.64,1.63,1.64, 
1/5/2000,1.04,1.03,1.03, 
1/5/2000,1.65,1.64,#N/A N/A, 
1/6/2000,1.04,1.03,1.03, 
1/7/2000,1.65,1.64,1.65")[1:4]) 

#   Date px.high px.low px.last 
# 1 03/Jan/2000 1.03 1.01 1.02 
# 2 03/Jan/2000 1.64 1.61 1.64 
# 3 1/4/2000 1.03 1.02 1.03 
# 4 1/4/2000 1.64 1.63 1.64 
# 5 1/5/2000 1.04 1.03 1.03 
# 6 1/5/2000 1.65 1.64  NA 
# 7 1/6/2000 1.04 1.03 1.03 
# 8 1/7/2000 1.65 1.64 1.65 

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

f_dat <- function(x) 
    as.Date(x, format = ifelse(is.na(as.numeric(gsub('/','',x))), 
          '%d/%b/%Y', '%d/%m/%Y')) 


## and format the dates: 

(dat <- within(dat, { 
    Date <- f_dat(Date) 
})) 

#   Date px.high px.low px.last 
# 1 2000-01-03 1.03 1.01 1.02 
# 2 2000-01-03 1.64 1.61 1.64 
# 3 2000-04-01 1.03 1.02 1.03 
# 4 2000-04-01 1.64 1.63 1.64 
# 5 2000-05-01 1.04 1.03 1.03 
# 6 2000-05-01 1.65 1.64  NA 
# 7 2000-06-01 1.04 1.03 1.03 
# 8 2000-07-01 1.65 1.64 1.65 

EDIT

dat <- read.csv(header = TRUE, na.strings = c('#N/A N/A'), 
       stringsAsFactors = FALSE, 
       text=",Date,px high,px low,px last,,,,Date,px high,px low,px last 
eur curncy,03/Jan/2000,1.03,1.01,1.02,,,gbp curncy,03/Jan/2000,1.64,1.61,1.64 
,1/4/2000,1.03,1.02,1.03,,,,1/4/2000,1.64,1.63,1.64 
,1/5/2000,1.04,1.03,1.03,,,,1/5/2000,1.65,1.64,#N/A N/A 
,1/6/2000,1.04,1.03,1.03,,,,1/7/2000,1.65,1.64,1.65") 


#   X  Date px.high px.low px.last X.1 X.2  X.3  Date.1 px.high.1 px.low.1 px.last.1 
# 1 eur curncy 03/Jan/2000 1.03 1.01 1.02 NA NA gbp curncy 03/Jan/2000  1.64  1.61  1.64 
# 2    1/4/2000 1.03 1.02 1.03 NA NA    1/4/2000  1.64  1.63  1.64 
# 3    1/5/2000 1.04 1.03 1.03 NA NA    1/5/2000  1.65  1.64  NA 
# 4    1/6/2000 1.04 1.03 1.03 NA NA    1/7/2000  1.65  1.64  1.65 


f_dat <- function(x) 
    as.Date(x, format = ifelse(is.na(as.numeric(gsub('/','',x))), 
          '%d/%b/%Y', '%d/%m/%Y')) 

(dat <- within(dat, { 
    Date <- f_dat(Date) 
    Date.1 <- f_dat(Date.1) 
})) 

#   X  Date px.high px.low px.last X.1 X.2  X.3  Date.1 px.high.1 px.low.1 px.last.1 
# 1 eur curncy 2000-01-03 1.03 1.01 1.02 NA NA gbp curncy 2000-01-03  1.64  1.61  1.64 
# 2   2000-04-01 1.03 1.02 1.03 NA NA   2000-04-01  1.64  1.63  1.64 
# 3   2000-05-01 1.04 1.03 1.03 NA NA   2000-05-01  1.65  1.64  NA 
# 4   2000-06-01 1.04 1.03 1.03 NA NA   2000-07-01  1.65  1.64  1.65 
+0

Почему код CSV неработоспособной? Я в основном просто копировал и вырезал его из файла CSV. Кроме того, данные, которые вы представляете, не так, как предполагается. Когда я печатаю переменную, которую вы назвали 'dat', я должен получить другую таблицу. Я отредактирую исходное сообщение, чтобы показать, как это должно быть. – Addem

+0

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

+0

Так что в коде есть какие-то приятные вещи, которые я раньше не видел, чтобы определенно помочь в вопросах форматирования, поэтому спасибо. Тем не менее, я до сих пор не знаю, как решить мою самую большую проблему, связанную с удалением соответствующих частей данных. Например, я хотел бы иметь возможность удалить третью строку второй группы данных, поскольку она имеет значение NA. Затем я хотел бы удалить ту же дату для первой группы значений. Тогда я также хотел бы удалить четвертую дату первой группы, потому что она содержит дату, 2000-06-01, которую нет у другой. – Addem