2016-02-24 2 views
1

Я пытаюсь сортировать символы акций по рыночной капитализации Я пробовал код ниже, но список не отсортировался должным образом. Есть ли простой способ удалить $ и преобразовать M и B в числовые?R: TTR: Сортировка по рыночной капитализации

library(TTR) 
listings <- stockSymbols() 
listings <- listings[order(as.numeric(listings$MarketCap),decreasing=TRUE),] 
head(listings,20) 

Буду благодарен Вам за помощь.

ответ

2

Могут быть пакеты, которые обеспечивают функции для преобразования, например. "$23.93M" к 239600000.00, но вот один подход функционирует с использованием базы R:

listings$MktCap <- as.numeric(
    sub("\\$(\\d+(\\.\\d+)?)[A-Z]?", "\\1", listings$MarketCap)) * 
    ifelse(gsub("[^A-Z]", "", listings$MarketCap) == "M", 1e6, 
     ifelse(gsub("[^A-Z]", "", listings$MarketCap) == "B", 1e9, 1.0)) 

head(listings[order(listings$MktCap, decreasing = TRUE),], 5) 
#  Symbol     Name LastSale MarketCap IPOyear  Sector 
#382 AAPL    Apple Inc. 94.69 $525.02B 1980 Technology 
#1637 GOOGL   Alphabet Inc. 717.29 $493.72B  NA Technology 
#1636 GOOG   Alphabet Inc. 695.85 $478.97B 2004 Technology 
#2238 MSFT Microsoft Corporation 51.18 $404.8B 1986 Technology 
#6664 XOM Exxon Mobil Corporation 81.23 $338.16B  NA  Energy 
# 
#           Industry Exchange  MktCap 
#382       Computer Manufacturing NASDAQ 525020000000 
#1637 Computer Software: Programming, Data Processing NASDAQ 493720000000 
#1636 Computer Software: Programming, Data Processing NASDAQ 478970000000 
#2238   Computer Software: Prepackaged Software NASDAQ 404800000000 
#6664      Integrated oil Companies  NYSE 338160000000 

Вкратце,

  • sub("\\$(\\d+(\\.\\d+)?)[A-Z]?", "\\1", listings$MarketCap) экстракты только десятичное число часть MarketCap, например, 525.02 от $525.02B; и результат передается as.numeric
  • gsub("[^A-Z]", "", listings$MarketCap) удаляет все, кроме прописных букв, которые должны быть только B или M, насколько я могу видеть
  • Использование вложенных ifelse заявления, результатом этого выражения будет отображать "B" в 1e9 , "M" к 1e6, а все остальное до 1

на данный момент, MktCap должно быть правильное числовое представление MarketCap и сортировка проста.

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