我试图按市值对股票符号进行排序--我尝试了下面的代码,但列表没有正确排序。是否有一种简单的方法来移除$并将M和B转换为数字?
library(TTR)
listings <- stockSymbols()
listings <- listings[order(as.numeric(listings$MarketCap),decreasing=TRUE),]
head(listings,20)我很感谢你的帮助。
发布于 2016-02-24 13:21:21
可能有提供转换功能的包,例如"$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.02B中提取525.02;结果将传递给as.numeric。gsub("[^A-Z]", "", listings$MarketCap)移除大写字母以外的所有内容,这些字母只应该是B或M。ifelse语句,上述表达式的结果将将"B"映射到1e9,将"M"映射到1e6,将所有其他映射到1。此时,MktCap应该是MarketCap的正确数字表示,排序非常简单。
https://stackoverflow.com/questions/35601162
复制相似问题