2017-02-27 97 views
1

我在.rData文件中給出了一些數據。格式是字符模式下的xts對象。 (I意識到這是一個不尋常的格式,但我有在它沒有控制)如何將字符串矩陣轉換爲粗體?

> head(trades) 
        SYMBOL EX PRICE SIZE COND BID BIDSIZ OFR 
2012-05-04 09:30:00 "BAC" "T" "7.89" "38538" "F" "7.89" "523" "7.9" 
2012-05-04 09:30:01 "BAC" "Z" "7.885" "288" "@" "7.88" "61033" "7.9" 
2012-05-04 09:30:03 "BAC" "X" "7.89" "1000" "@" "7.88" "1974" "7.89" 
2012-05-04 09:30:07 "BAC" "T" "7.89" "19052" "F" "7.88" "1058" "7.89" 
2012-05-04 09:30:08 "BAC" "Y" "7.89" "85053" "F" "7.88" "108101" "7.9" 
2012-05-04 09:30:09 "BAC" "D" "7.8901" "10219" "@" "7.89" "268" "7.9" 

> mode(trades) 
'character' 

我想通過轉換成理智格式,即tibble來處理這些數據,這樣我可以存儲該列作爲日期時間,雙打和整數。

我設法用下面的代碼來實現這一目標:

> trades_ = bind_cols(data_frame(DATE=index(trades)), as_data_frame(coredata(trades))) %>% 
    mutate_at(as.numeric, .cols=vars(PRICE, BID, OFR)) %>% 
    mutate_at(as.integer, .cols=vars(SIZE, BIDSIZ, OFRSIZ)) 

> head(trades_) 
# A tibble: 6 × 10 
       DATE SYMBOL EX PRICE SIZE COND BID BIDSIZ OFR 
       <dttm> <chr> <chr> <dbl> <int> <chr> <dbl> <int> <dbl> 
1 2012-05-04 09:30:00 BAC  T 7.8900 38538  F 7.89 523 7.90 
2 2012-05-04 09:30:01 BAC  Z 7.8850 288  @ 7.88 61033 7.90 
3 2012-05-04 09:30:03 BAC  X 7.8900 1000  @ 7.88 1974 7.89 
4 2012-05-04 09:30:07 BAC  T 7.8900 19052  F 7.88 1058 7.89 
5 2012-05-04 09:30:08 BAC  Y 7.8900 85053  F 7.88 108101 7.90 
6 2012-05-04 09:30:09 BAC  D 7.8901 10219  @ 7.89 268 7.90 

我不知道是否有已經爲這個內置的功能。查看trades矩陣的每一列,並計算出它是一列整數,雙精度等,並將其轉換爲適當的類型。

這是csv解析器會做的事情。

+2

'?type.convert',這是因爲你猜到了,作爲''read.csv'等read.table'你 – thelatemail

+0

可能會更好過明確設置類型這樣的輔助函數。當計算機猜錯時追蹤錯誤可能是一個痛苦。 –

+0

@HongOoi:我認爲你可能是對的,'type.convert'不喜歡''SIZE'列中的''1e + 05'' ... – user357269

回答

1

這是遠從權威的答案,但我最終這樣做:

smarter_type_convert = function (vector) { 
    converted_vector = type.convert(vector) 
    if (is.numeric(converted_vector)) { 
     int_vector = as.integer(converted_vector) 
     if (isTRUE(all.equal(int_vector, converted_vector, check.attributes=FALSE))) { 
      int_vector 
     } else { 
      converted_vector 
     } 
    } else { 
     converted_vector 
    } 
} 

trades %>% coredata %>% as_data_frame %>% mutate_all(smarter_type_convert) 
0

你說的沒錯,一個數據幀是正確的做法,因爲你正在使用多個類在同一個框架工作。 xts不允許多個類,因此強制規則強制您使用字符而不是數字。

這是一個解決方案,所以你不必專門調出每一列。我使用tidyquant軟件包,該軟件包用於在「tidyverse」(即使用「整齊」數據幀)內處理定量數據。它還有一些很好的功能可以轉換爲xts,matrix和其他包含行名的時間序列類。

首先,我重新創建數據。

> trades_xts 
        SYMBOL EX PRICE SIZE COND BID BIDSIZ OFR  
2012-05-04 09:30:00 "BAC" "T" "7.8900" "38538" "F" "7.89" "523" "7.90" 
2012-05-04 09:30:01 "BAC" "Z" "7.8850" "288" "@" "7.88" "61033" "7.90" 
2012-05-04 09:30:03 "BAC" "X" "7.8900" "1000" "@" "7.88" "1974" "7.89" 
2012-05-04 09:30:07 "BAC" "T" "7.8900" "19052" "F" "7.88" "1058" "7.89" 
2012-05-04 09:30:08 "BAC" "Y" "7.8900" "85053" "F" "7.88" "108101" "7.90" 
2012-05-04 09:30:09 "BAC" "D" "7.8901" "10219" "@" "7.89" "268" "7.90" 

接下來,我使用整潔的函數來清理數據。這比你的腳本稍長一些,但你不必擔心哪些列有哪些數據類型(除了xts索引)。請注意,我使用tidyquant::as_tibble()函數將xts行名稱轉換爲列。我使用mutate_eachtype.convert函數應用於每列。不幸的是,基地R喜歡factor類,所以我添加了一個額外的步驟轉換爲character。最後兩個步驟僅使用dplyr::renamelubridate::as_datetime清理日期 - 時間列,其中tidyquant爲您加載。

> library(tidyquant) 
> trades_xts %>% 
    as_tibble(preserve_row_names = TRUE) %>% 
    mutate_each(funs(type.convert)) %>% 
    mutate_if(is.factor, as.character) %>% 
    rename(DATE = row.names) %>% 
    mutate(DATE = as_datetime(DATE, tz = Sys.timezone())) 
    # A tibble: 6 × 9 
       DATE SYMBOL EX PRICE SIZE COND BID BIDSIZ OFR 
       <dttm> <chr> <chr> <dbl> <int> <chr> <dbl> <int> <dbl> 
1 2012-05-04 09:30:00 BAC  T 7.8900 38538  F 7.89 523 7.90 
2 2012-05-04 09:30:01 BAC  Z 7.8850 288  @ 7.88 61033 7.90 
3 2012-05-04 09:30:03 BAC  X 7.8900 1000  @ 7.88 1974 7.89 
4 2012-05-04 09:30:07 BAC  T 7.8900 19052  F 7.88 1058 7.89 
5 2012-05-04 09:30:08 BAC  Y 7.8900 85053  F 7.88 108101 7.90 
6 2012-05-04 09:30:09 BAC  D 7.8901 10219  @ 7.89 268 7.90