У меня есть следующий файл .csv, который я загрузил в Интернете:

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]
r csv
0
Oposum 3 Май 2016 в 03:16

3 ответа

Лучший ответ

Рассмотрите возможность простого транспонирования фрейма данных с помощью 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
2
Parfait 3 Май 2016 в 17:45

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

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

Я подозреваю, что это происходит потому, что во многих разделах встречается название «Среднее за 3 года» и т. Д.

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

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'))
2
Andrew Lavers 3 Май 2016 в 01:27

Это не решает всех вопросов, но вы можете попробовать 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
Robert 3 Май 2016 в 00:59