read.table 和解析 R 中的 float 据

标签 r read.table

注意:我在 Linux (Ubuntu) 下运行 R 3.1.0 版

我在读取 R 中包含数字数据的表格时遇到了一些问题。我遇到的问题是,当精度位数很高时,数据值被视为字符串。这是给我带来问题的表格示例:

msg response n0 n1 n2 n3 n4 n5 n6 n7 n8 n9
msg1 4 -8.314690711575918266335732953464798811183e-05 1.139425533125117255301306934400784598438e-05 9.503124106937629582566272323784772879662e-06 2.415320116298135376549892361364157977732e-05 -1.353325883105214074147038677553567254108e-05 2.743323866399369198717725359948360619455e-05 -4.629775061411642273585462237228682624846e-05 -1.611105562520185479919582194341387548775e-05 9.303209992254288568836080586255121716022e-06 -4.192870939939395803850840510618169787449e-06
msg2 4 -3.611496438997624286362103651626398459484e-05 -8.986649394512085512235453899076986772343e-06 7.589764253165846911953693054719849442336e-06 1.616400267231418242178109245799078053096e-05 -1.526732983856187713810233230748991672954e-05 1.743628297561072431091575007933158758533e-05 -2.846844692907498901453776374292914397302e-05 1.910917369883424870436036333010143550837e-06 1.060973752299795451253458522522521434439e-05 5.283193676322738203433859727198296241113e-06
msg3 4 -0.0001060601071428207497300208461687986982724 1.027264327422263220793499649552416030929e-05 -3.608702286865399390782330191207449843205e-05 2.463770125931904770438807261712099716533e-05 -2.707646168769790211497405785223691054853e-05 1.824322030326995844979817706921210174187e-05 -4.163950636627347521223282966751355615997e-05 -3.947141093240102418734926992271994095063e-05 -1.633998563288527501930120534867629800146e-06 4.412603665193812957150912984483070999886e-06
msg4 4 -0.000121334293429932005108085046884980329196 9.283822398007155829793846102404586417833e-06 -3.726310180864754364581797885236369438644e-05 2.523073977181553947837615303750880002553e-05 -2.252686102961384332602108593324174989903e-05 2.220172814784364916226508390728611175291e-05 -4.219560948255805576728380557050002153119e-05 -4.115875111582061095325674182632269548776e-05 -2.267374303525501092035267930446806872169e-06 5.209299560944787675230600865194929838253e-06
msg5 4 -5.963997294600213177240451145610933281205e-06 -5.594841271246116443842735788116726780572e-05 8.991174655153081360457051340873135814036e-06 4.203506863375082284756817374571369327896e-05 -1.989807857681896938466421798086258831972e-05 3.04495767222585380328003790140201090253e-05 -1.591460846822479054639420947836470077164e-05 4.294633848811773823021982476877411727401e-06 4.220214017482982609167849186171395103884e-06 1.157499734817441450695444521423738137855e-05
msg6 4 -5.757494877668747890447215054265939215838e-05 2.741617749169015139272531644820674046059e-05 4.422657311126682953947211046630272335278e-06 3.118621791843399223371699480189533915109e-05 -2.54913507837490764233886152145824866011e-06 1.668527948142188905189704783982307390033e-05 -3.665243026365731804101094626346935001493e-05 -1.774860939138463391986748340922730449165e-05 -9.437116426442203616473287930421776081857e-06 4.03326883075208373160462985151930581651e-06
msg7 4 -4.526264989491999218363185719660179984203e-05 1.483263645568602201929228612264921594033e-05 4.087720477909908528666056704015119294127e-06 1.920571731547699898760145353904249532206e-05 -1.564553983669907539491225612060532057512e-05 1.799543282360107306397899173955323703922e-05 -2.784583397317313835784939601847298717985e-05 -9.307842087967104895769761274681997065272e-06 2.510176669678788066936495071423962599511e-05 1.165519106997573994539529190772597644354e-05
msg8 4 3.528469551722670672358949869873434579404e-06 -3.802444684832243009193000760070901833387e-05 -4.299962815654065943435108848591497121561e-06 2.830037412755719857622091484294912788755e-05 -1.224718034632651075777846211289912048414e-05 1.728156941936226072623061789101939211832e-05 -1.40622706723058055145944567065896535496e-05 -6.418919372655702643636847076757945274039e-07 -5.252567441890823979582913344499317531699e-06 1.930561653934263693579856738247180203416e-06
msg9 4 -6.756132909916527683798909142964816965105e-05 2.923743557551206846190951227359988706667e-05 5.398129579087212920091194690019875679354e-06 6.235790555960372960608850689823157154024e-06 -3.955754297671020359506485059020164385402e-06 7.416563694685102349675193816880280905934e-06 -2.921110432668753617829054958221490778669e-05 -1.239340340918036865818212949319487847788e-05 2.667195778743546561752320034344165833318e-05 6.586339001327654648493270528319953882601e-06
msg10 4 -3.149092649667588643055959884975436580135e-05 2.731300737897044854157399540461881315423e-05 4.707473251694518616579897274387889183345e-06 3.048649770891627533474579903050027951394e-05 -6.407889019038220842746159111591452983703e-06 2.030540405085198013969242925025326940158e-05 -3.713555842238923788804771941585158856469e-05 9.790880145251530680293103325873005360336e-06 -4.555576604614221173478964127534496242333e-06 -8.766045708548195287339137304893910140891e-06

当我将这些数据加载到 R 中时,似乎每一列都被解释为一个级别,例如:

> bad <- read.table("bad.tab", header = TRUE)
> bad$n1
 [1] 1.139425533125117255301306934400784598438e-05
 [2] -8.986649394512085512235453899076986772343e-06
 [3] 1.027264327422263220793499649552416030929e-05
 [4] 9.283822398007155829793846102404586417833e-06
 [5] -5.594841271246116443842735788116726780572e-05
 [6] 2.741617749169015139272531644820674046059e-05
 [7] 1.483263645568602201929228612264921594033e-05
 [8] -3.802444684832243009193000760070901833387e-05
 [9] 2.923743557551206846190951227359988706667e-05
[10] 2.731300737897044854157399540461881315423e-05
10 Levels: 1.027264327422263220793499649552416030929e-05 ...
> 

我发现我可以通过将数据截断为 15 位精度来解决这个问题(我在 PERL 中使用了 sprintf("%.15g", ...))。

msg response n0 n1 n2 n3 n4 n5 n6 n7 n8 n9
msg1 4 -8.31469071157592e-05 1.13942553312512e-05 9.50312410693763e-06 2.41532011629814e-05 -1.35332588310521e-05 2.74332386639937e-05 -4.62977506141164e-05 -1.61110556252019e-05 9.30320999225429e-06 -4.1928709399394e-06
msg2 4 -3.61149643899762e-05 -8.98664939451209e-06 7.58976425316585e-06 1.61640026723142e-05 -1.52673298385619e-05 1.74362829756107e-05 -2.8468446929075e-05 1.91091736988342e-06 1.0609737522998e-05 5.28319367632274e-06
msg3 4 -0.000106060107142821 1.02726432742226e-05 -3.6087022868654e-05 2.4637701259319e-05 -2.70764616876979e-05 1.824322030327e-05 -4.16395063662735e-05 -3.9471410932401e-05 -1.63399856328853e-06 4.41260366519381e-06
msg4 4 -0.000121334293429932 9.28382239800716e-06 -3.72631018086475e-05 2.52307397718155e-05 -2.25268610296138e-05 2.22017281478436e-05 -4.21956094825581e-05 -4.11587511158206e-05 -2.2673743035255e-06 5.20929956094479e-06
msg5 4 -5.96399729460021e-06 -5.59484127124612e-05 8.99117465515308e-06 4.20350686337508e-05 -1.9898078576819e-05 3.04495767222585e-05 -1.59146084682248e-05 4.29463384881177e-06 4.22021401748298e-06 1.15749973481744e-05
msg6 4 -5.75749487766875e-05 2.74161774916902e-05 4.42265731112668e-06 3.1186217918434e-05 -2.54913507837491e-06 1.66852794814219e-05 -3.66524302636573e-05 -1.77486093913846e-05 -9.4371164264422e-06 4.03326883075208e-06
msg7 4 -4.526264989492e-05 1.4832636455686e-05 4.08772047790991e-06 1.9205717315477e-05 -1.56455398366991e-05 1.79954328236011e-05 -2.78458339731731e-05 -9.3078420879671e-06 2.51017666967879e-05 1.16551910699757e-05
msg8 4 3.52846955172267e-06 -3.80244468483224e-05 -4.29996281565407e-06 2.83003741275572e-05 -1.22471803463265e-05 1.72815694193623e-05 -1.40622706723058e-05 -6.4189193726557e-07 -5.25256744189082e-06 1.93056165393426e-06
msg9 4 -6.75613290991653e-05 2.92374355755121e-05 5.39812957908721e-06 6.23579055596037e-06 -3.95575429767102e-06 7.4165636946851e-06 -2.92111043266875e-05 -1.23934034091804e-05 2.66719577874355e-05 6.58633900132765e-06
msg10 4 -3.14909264966759e-05 2.73130073789704e-05 4.70747325169452e-06 3.04864977089163e-05 -6.40788901903822e-06 2.0305404050852e-05 -3.71355584223892e-05 9.79088014525153e-06 -4.55557660461422e-06 -8.7660457085482e-06

R 似乎对此很满意:

> good <- read.table("good.tab", header = TRUE)
> good$n1
 [1]  1.139426e-05 -8.986649e-06  1.027264e-05  9.283822e-06 -5.594841e-05
 [6]  2.741618e-05  1.483264e-05 -3.802445e-05  2.923744e-05  2.731301e-05
> 

我的问题是:有没有办法说服 R 将第一个表中的 float 据解析为数值?

最佳答案

使用 read.table colClasses 参数明确使用数字。应该这样做:

cols <- c('character', 'integer', rep('numeric', 10))
fixed <- read.table("bad.tab", header = TRUE, colClasses = cols)

关于read.table 和解析 R 中的 float 据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23459285/

相关文章:

r - 根据 R 中的查找表保留特定的重复项

阅读 R 中的表格?

r - read.table和read.delim函数之间的区别

在 R 中读取大数据和逻辑回归

R 中的 read.table 函数删除元素

r - 将图像插入图表区域外的 ggplot

R:通过选择某些行来生成频率表

r - 警告 : closing unused connection n

r - 文档引用类及其方法与 roxygen2

r - 语法无效名称的后果