2

私は奇妙なサブセット化の問題に遭遇しました。問題は、一方の列をサブセット化できるが、もう一方の列をサブセット化できないことです。両方の列は、readHTMLTableによって同じ方法で解析されたようです。

複製するコード

require(XML)
theurl <- "http://en.wikipedia.org/wiki/List_of_stock_exchanges"
html <- htmlParse(theurl)
seData <- readHTMLTable(html)[[2]]
names(seData) = c("Rank","EX","Economy","HQ","MarketCap","TradeValue")
seData = transform(seData,MarketCap = as.numeric(gsub(",","",MarketCap)))
seData = transform(seData,TradeValue = as.numeric(gsub(",","",TradeValue)))

インド証券取引所のサブセットにしたいので、以下を使用しました。

> subset(seData,seData$Economy == "India")
[1] Rank       EX         Economy    HQ         MarketCap  TradeValue
<0 rows> (or 0-length row.names)
> subset(seData,seData$Economy == " India")
[1] Rank       EX         Economy    HQ         MarketCap  TradeValue
<0 rows> (or 0-length row.names)

条件を満たす必要のある行が2つあることを検証したにもかかわらず、行が返されませんが、他の列「EX」に対して同じことを簡単に行うことができます。

> subset(seData,seData$EX == "JSE Limited")
   Rank          EX      Economy           HQ MarketCap TradeValue
17   17 JSE Limited  SouthAfrica Johannesburg       903        287

他の関数を実行しましたが、2つの列はまったく同じように見えます。

> sapply(seData,class)
      Rank         EX    Economy         HQ  MarketCap TradeValue 
  "factor"   "factor"   "factor"   "factor"  "numeric"  "numeric" 
> levels(seData$Economy)
 [1] " Australia"             " Brazil"                " Canada"               
 [4] " China"                 " Germany"               " Hong Kong"            
 [7] " India"                 " Japan"                 " Russia"               
...
> levels(seData$EX)
 [1] "Australian Securities Exchange"   "BME Spanish Exchanges"           
 [3] "BM&F Bovespa"                     "Bombay Stock Exchange"           
 [5] "Deutsche Börse"                  "Hong Kong Stock Exchange"        
 [7] "JSE Limited"                      "Korea Exchange"                  
 ...    

私は何を取りこぼしたか?使用したサブセット化コマンドの何が問題になっていますか?:(

subset(seData,seData$Economy == " India")
4

1 に答える 1

2

コメントで述べたように、この問題は主にデータ内の非標準文字が原因で発生しますが、文字エンコード設定が原因で発生すると推測しています。

を使用する代わりに、subset標準の[サブセットを使用grepl greplすると、論理値のベクトルが得られます。これを使用して、データフレームをサブセット化します。これにより、部分的なマッチングと追加のボーナスを行うことができます

> seData[grepl('India', seData$EX),]
   Rank                               EX Economy     HQ MarketCap TradeValue
11   11 National Stock Exchange of India  India Mumbai      1234        442

編集

grepl関数内でもsubset機能します

> subset(seData,  grepl('India', seData$EX) )
   Rank                               EX Economy     HQ MarketCap TradeValue
11   11 National Stock Exchange of India  India Mumbai      1234        442
于 2013-02-14T06:56:44.420 に答える