2017-06-16 15 views
1

CoinMarketCap価格表を取得しようとしています。私はした:テーブルの文字列置換

url_cmp <- "https://coinmarketcap.com/currencies/views/all/" 
library(rvest) 

url_cmp %>% 
read_html() %>% 
html_nodes(css = "table") %>% 
html_table() -> "tbl_cmp" 

今私はテーブル全体をきれいにしたいと思います。テーブルからすべて$,%,、の文字を削除します。私が試した:

stringr::str_replace_all(string = tbl_cmp, pattern = "\\\n|\\s|[%*$,]", replacement = "") 

gsub(pattern = "\\\n|\\s|[%*$,]", replacement = "", x = df_cmp) 

を意図し、交換しませんが、表形式がもはや保持されている両方。私は長い文字列を取得します。私はstr_replace()gsub()の両方が入力として文字列を取ることを理解しています。テーブルの回避策はありますか?

+1

構造全体を保持するために、列全体にgsub関数を適用することをお勧めします。https://stackoverflow.com/questions/29271549/replace-all-occurrences-of-aデータフレーム-string-in-a-data-frame –

+1

「as.data.frame(sapply(tbl_cmp [[1])、function(i)gsub( '[[:punct:]] | \\\ n' 、 ''、i))) ' – Sotos

答えて

1
new_df <- tbl_cmp[[1]] %>% sapply(gsub,pattern = "\\\n|\\s|[%*$,]", replacement = "") %>% as.data.frame(stringsAsFactors = FALSE) 
num_cols <- names(new_df)[-(2:3)] 
conv_col_to_num <- function(x){if(x %in% num_cols) new_df[[x]] %>% as.numeric %>% data.frame else new_df[[x]] %>% data.frame} 
new_df_num <- 
    new_df %>% 
    names %>% 
    lapply(conv_col_to_num) %>% 
    do.call(cbind,.) %>% 
    setNames(names(new_df)) 

# > head(new_df_num) 
# #   Name Symbol Market Cap  Price Circulating Supply Volume (24h) % 1h % 24h % 7d 
# 1 1   Bitcoin BTC 40690438752 2481.970000   16394412 1406060000 0.03 8.06 -12.62 
# 2 2  Ethereum ETH 33960266690 367.000000   92535795 1554170000 -0.02 15.09 35.91 
# 3 3   Ripple XRP 10036645930 0.262120  38290271363 109902000 -0.04 4.58 -9.87 
# 4 4    NEM XEM 1784268000 0.198252   8999999999  7966520 0.60 13.42 -10.20 
# 5 5 EthereumClassic ETC 1687441250 18.210000   92656987 108333000 -0.28 8.45 4.40 
# 6 6  Litecoin LTC 1649935702 31.990000   51575157 365949000 2.24 14.14 6.57 

# > str(new_df_num) 
# 'data.frame': 754 obs. of 10 variables: 
# $ #     : num 1 2 3 4 5 6 7 8 9 10 ... 
# $ Name    : Factor w/ 751 levels "1337","1CRedit",..: 74 245 558 446 246 395 179 358 90 616 ... 
# $ Symbol   : Factor w/ 751 levels "","1337","1CR",..: 98 236 718 695 235 377 169 402 106 579 ... 
# $ Market Cap  : num 4.07e+10 3.40e+10 1.00e+10 1.78e+09 1.69e+09 ... 
# $ Price    : num 2481.97 367 0.262 0.198 18.21 ... 
# $ Circulating Supply: num 1.64e+07 9.25e+07 3.83e+10 9.00e+09 9.27e+07 ... 
# $ Volume (24h)  : num 1.41e+09 1.55e+09 1.10e+08 7.97e+06 1.08e+08 ... 
# $ % 1h    : num 0.03 -0.02 -0.04 0.6 -0.28 2.24 0.09 1.5 -0.29 -0.71 ... 
# $ % 24h    : num 8.06 15.09 4.58 13.42 8.45 ... 
# $ % 7d    : num -12.62 35.91 -9.87 -10.2 4.4 ... 

注 Iは、(数値列で)適切にフォーマットdata.frameで終わるためにコードを追加しました。

私はパイプとの一貫性を保ちようとしましたが、サプリー(コメント参照)によって適用されました。

サプリーが出力でのみ行うのに対し、applyはマトリックスの入力に変換するので、私の関数が数字で作業しなければならない場合は適用できませんでした。

"?"

+0

素晴らしい!私は強力な 'apply()'関数群を忘れていました。 – moazzem

+0

私はdata.frameを返すように編集しました –

+0

2つのこと。 1: 'MARGIN = 2'で' apply'ではなく 'sapply'を使う方が良いです。そして2:どうしてピッキングを使用する必要がありますか? 'as.data.frame(.....)'の何が問題なのですか? – Sotos