2016-05-03 7 views
0

Я следующий .csv файл, который я скачал онлайн:Преобразование CSV-файл в R

financials.morningstar.com/ajax/exportKR2CSV.html?&t=AAPL 

Я пытаюсь изменить таблицу таким образом, чтобы имена столбцов даты и имена строк являются различные отношения и индексы, предоставленные в нем. Ниже мой код, но ни столбцы, ни имена строк не работают. Какие-либо предложения?

read.csv('/path_to_csv.csv',header=F)[-c(1:2),-c(12)]->spreadsheet 
spreadsheet_body<-spreadsheet[-1,-1] 
colnames(spreadsheet_body)<-spreadsheet[1,-1] 
rownames(spreadsheet_body)<-c() 
rownames(spreadsheet_body)<-spreadsheet[-1,1] 
+0

Если добавить имена столбцов, прежде чем сделать 'spreadsheet_body' вы можете добавить свои имена столбцов только с' таблицы [1,] ' , и вы получите правильные значения. Имена строк сложнее, потому что у вас есть повторяющиеся значения в разделе «Коэффициенты ключевых слов -> Рост» – desc

ответ

2

Рассмотрим просто транспонирования фрейм данных с t(), а затем заменить заголовки из первой строки. Ниже использует файл CSV AAPL из URL:

df <- read.csv('http://financials.morningstar.com/ajax/exportKR2CSV.html?&t=AAPL', 
      skip=2, stringsAsFactors = FALSE) 
df <- df[df[2]!='2006-09',]    # REMOVE REPEAT HEADERS 
df <- df[-grep('Key Ratios', df$X),]  # REMOVE KEY RATIO HEADERS 

finaldf <- data.frame(t(df), stringsAsFactors = FALSE) 
colnames(finaldf) <- finaldf[1,] 
finaldf <- finaldf[-1,] 

# PERIOD COLUMN 
finaldf$Period <- as.character(rownames(finaldf)) 
finaldf$Period <- gsub("X", "Y", gsub("\\.", "M", finaldf$Period)) 

rownames(finaldf) <- 1:nrow(finaldf)      # RESET ROWNAMES 
finaldf <- finaldf[,c(ncol(finaldf), 2:ncol(finaldf)-1)] # RE-ORDER PERIOD TO START 

# CONVERT TO NUMERIC 
for (i in names(finaldf)) { 
     if (i != "Period") { 
      finaldf[[i]] <- as.numeric(gsub(",", "", finaldf[[i]])) 
     } 
    } 

finaldf[, c(1:7)] 

Выходной

#  Period Revenue USD Mil Gross Margin % Operating Income USD Mil 
# 1 Y2006M09   19315   29.0      2453 
# 2 Y2007M09   24006   34.0      4409 
# 3 Y2008M09   32479   34.3      6275 
# 4 Y2009M09   42905   40.1     11740 
# 5 Y2010M09   65225   39.4     18385 
# 6 Y2011M09   108249   40.5     33790 
# 7 Y2012M09   156508   43.9     55241 
# 8 Y2013M09   170910   37.6     48999 
# 9 Y2014M09   182795   38.6     52503 
# 10 Y2015M09   233715   40.1     71230 
# 11  TTM   227535   39.8     66864 
# Operating Margin % Net Income USD Mil Earnings Per Share USD 
# 1    12.7    1989     0.32 
# 2    18.4    3496     0.56 
# 3    19.3    4834     0.77 
# 4    27.4    8235     1.30 
# 5    28.2    14013     2.16 
# 6    31.2    25922     3.95 
# 7    35.3    41733     6.31 
# 8    28.7    37037     5.68 
# 9    28.7    39510     6.45 
# 10    30.5    53394     9.22 
# 11    29.4    50678     8.97 
+0

выглядит почти идеально, но есть ли способ избежать деформирования дат в формате 'X2007.06', но вместо этого сохранить его в целости, чтобы я мог форматировать это в настоящие даты? – Oposum

+0

Пара вещей: * X * помещается потому, что R не позволяет столбцам начинать с цифр. И транспозиция сохранила это имя. Во-вторых, столбец не является полным форматом даты, так как заголовок отчета не имел номера дня. Плюс * TTM * для рассмотрения. – Parfait

+0

См. Обновление, где я добавляю столбец Period, заменяющий X и десятичный, и даже преобразовываю все столбцы символов в числовые. – Parfait

2

Это не решает все вопросы, но вы можете попробовать rownames по частям:

read.csv("http://financials.morningstar.com/ajax/exportKR2CSV.html?&t=AAPL",header=T,stringsAsFactors = F,skip = 2)[,-c(12)]->spreadsheet 
#str(spreadsheet) 
View(spreadsheet) 
2

Вы не даете конкретное сообщение. Когда я запускаю код, я получаю

duplicate 'row.names' are not allowed 
In addition: Warning message: 
non-unique values when setting 'row.names': ‘’, ‘10-Year Average’, ‘3-Year Average’, ‘ 

Я подозреваю, что это происходит, потому что имя 3-Year Average и т. Д. Происходит во многих разделах.

Это возможный подход (только для трех разделов), который является утомительным, но может облегчить последующую обработку.

financials <- read.table('Downloads/AAPL Key Ratios.csv',sep=",",quote = '"', skip=3, nrow=15, 
         col.names=c('item', 'Y2006M09', 'Y2007M09',  'Y2008M09',  'Y2009M09', 'Y2010M09', 
            'Y2011M09', 'Y2012M09', 'Y2013M09', 'Y2014M09', 'Y2015M09', 'TTM')) 
margins <- read.table('Downloads/AAPL Key Ratios.csv',sep=",",quote = '"', skip=21, nrow=9, 
         col.names=c('item', 'Y2006M09', 'Y2007M09',  'Y2008M09',  'Y2009M09', 'Y2010M09', 
            'Y2011M09', 'Y2012M09', 'Y2013M09', 'Y2014M09', 'Y2015M09', 'TTM')) 
revenue_percent <- read.table('Downloads/AAPL Key Ratios.csv',sep=",",quote = '"', skip=44, nrow=4, 
         col.names=c('item', 'Y2006M09', 'Y2007M09',  'Y2008M09',  'Y2009M09', 'Y2010M09', 
            'Y2011M09', 'Y2012M09', 'Y2013M09', 'Y2014M09', 'Y2015M09', 'TTM'))