fread 讀取檔案時 數字按照因素進行讀取的方法 colClasses = "Levels"
阿新 • • 發佈:2018-11-03
背景
使用asreml分析資料時, 得到的是sln資料,進行多性狀分析或者隨機迴歸分析時,sln中的Level是1.001,小數點前面的1表示第一個性狀,後面的001表示ID。
有時候需要將1.001分為1和001,R中的tidyverse中的separate可以分割,但是由於data.table中的fread讀取時,將1.001當作數字,在分割時,1.010和1.100都分割為1,這明顯是錯誤的。
示例
txt資料:
比如上面的資料,想將第二列分為1和1:10,但是第十行,分割結果為1!這不是我想要的。
library(data.table)
library(tidyverse)
dd <-fread("d:/test-datatable.txt" )
separate(dd,2,into=c("a","b"),sep="\\.",remove = T)
# V1 a b
# 1: 1 1 01
# 2: 2 1 02
# 3: 3 1 03
# 4: 4 1 04
# 5: 5 1 05
# 6: 6 1 06
# 7: 7 1 07
# 8: 8 1 08
# 9: 9 1 09
# 10: 10 1 1
解決方法
在fread中增加引數:colClasses = “Level”
library(data.table)
library(tidyverse)
# dd <-fread("d:/test-datatable.txt")
dd <-fread("d:/test-datatable.txt",colClasses = "Level")
dd
str(dd)
separate(dd,2,into=c("a","b"),sep="\\.",remove = T)
# V1 a b
# 1: 1 1 01
# 2: 2 1 02
# 3: 3 1 03
# 4: 4 1 04
# 5: 5 1 05
# 6: 6 1 06
# 7: 7 1 07
# 8: 8 1 08
# 9: 9 1 09
# 10: 10 1 10