R語言數(shù)值取消科學計數(shù)法表示的操作
我就廢話不多說了,大家還是直接看代碼吧~
>#取消科學計數(shù)法 >options(scipen = 200) >#scipen 表示在200個數(shù)字以內(nèi)都不使用科學計數(shù)法
補充:R語言去除科學計數(shù)法 保留小數(shù)位
R語言 去除科學計數(shù)法 保留小數(shù)位
options(“scipen”=100, “digits”=4)
補充:R語言科學計數(shù)法數(shù)據(jù)改變/丟失/失準,取消科學計數(shù)法的原因和解決方法
問題描述
如何在R中取消科學計數(shù)法 &
對R中使用科學技術(shù)法表示的數(shù)據(jù)“取消科學計數(shù)法”以后,得到的值和原來的值會不一樣。
需求背景
分析留存數(shù)據(jù)時,數(shù)據(jù)庫底表的字段是一個30位/兩百位的字符串,比如0011111100000000000001,第一個0表示最近一天該用戶沒登陸,第三位的1表示3天前該用戶登陸了,以此類推
底表的格式是字符串,但我下載格式是csv,csv自動把這個字段的格式改成數(shù)值型了(我也不知道為啥),所以我用R讀取這個文件時,“0011111100000000000001“就變成了”11111100000000000001“,我需要在前面補0補滿30位
然而,補0的函數(shù)要求輸入的格式是字符串,但我直接把原始數(shù)據(jù)轉(zhuǎn)成字符串格式的話會發(fā)生下面這樣尷尬的情況,比如原始數(shù)據(jù)是“11111111111111111111111111111111111”,那么R就會顯示1.11+e30,然后轉(zhuǎn)成character 類型以后就直接變成“1.11+e30”,補0以后就會是“000001.1111e+30”(類似這樣,反正就是還有小數(shù)點和e等字樣)
所以,我需要先取消科學計數(shù)法的表示,然后再轉(zhuǎn)成字符串格式。
取消科學計數(shù)法的方法一
在讀取或處理數(shù)據(jù)前使用options函數(shù)
#取消科學計數(shù)法 options(scipen = 200) #scipen 表示在200位數(shù)字以內(nèi)都不使用科學計數(shù)法
取消科學計數(shù)法的方法二
在讀取或處理數(shù)據(jù)時使用format函數(shù)
#取消科學計數(shù)法 format(data, scientific=F) # data即處理的數(shù)據(jù)字段
后續(xù)的bug
用上面的方法一或者二以后,確實不是科學計數(shù)法了,可得到的值和原來的值會不一樣,如:
>a <-123456789987654321123456 >a [1] 1.234568e+23 >format(a,scientific=F) [1] “123456789987654325240268” >format(a,scientific=F,digits=14) [1] “123456789987654325240268” >format(a,scientific=F,digits=7) [1] “123456789987654325240268”
原因
對于很大的數(shù)(比如10^20量級),R的儲存不會保留全部精度,而是保留部分精度(比如前15位),忽略剩余精度(比如后5位)
解決方法
(1)最好就是從源頭解決問題,一開始拉取數(shù)據(jù)的時候就拉成文本格式,不要是數(shù)值格式,比如從SQL數(shù)據(jù)庫里拉原始數(shù)據(jù)的時候就用SQL指令把那行很大的數(shù)改成文本格式。
(2)用其他軟件如excel的導入數(shù)據(jù)功能,把原本數(shù)值格式的數(shù)據(jù)在導入時就改成文本格式,保存以后,再用R讀寫新文件
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
R語言數(shù)據(jù)可視化ggplot繪制置信區(qū)間與分組繪圖技巧
這篇文章主要為大家介紹了R語言數(shù)據(jù)可視化ggplot繪制置信區(qū)間與分組繪圖的技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11
R語言-生成頻數(shù)表和列聯(lián)表crosstable函數(shù)介紹
這篇文章主要介紹了R語言-生成頻數(shù)表和列聯(lián)表crosstable函數(shù)介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

