2011-07-15 44 views
3

我有一個R數據框,其中一列包含一串數字,但我想將它們視爲一個因子(主要是爲了阻止R用e + 04等縮短數字......)。我發現解決這個問題的一種方法是編輯從中獲取數據的csv文件,並添加一個虛擬條目,在所需列中包含一個單詞,然後重新導入它。我如何使用R函數獲得這種效果而不會混淆csv?如何在R數據框中顯示數字列而不使用科學計數法('e + 07')

爲了澄清,我的數據幀是這樣的:

pNum,Condition,numberEntered 
1,2,5.0970304e+07 

我想從數值變更numberEntered的數據類型來考量,並擺脫了討厭的E + 07。

回答

16

正如Joshua所說,這是一個印刷問題,而不是存儲問題。您可以通過調整getOption("scipen")改變所有數字印刷方式(=。

x <- c(1, 2, 509703045845, 0.0001) 
print(x) 
options(scipen = 50) 
print(x) 

或者,你可能希望改變只是這些數字格式化的方式(這將它們轉換爲character)。這是值得去到知道formatformatC。爲了讓您一開始,比較

format(x) 
format(x, digits = 10) 
format(x, digits = 3) 
format(x, digits = 3, scientific = 5) 
format(x, trim = TRUE, digits = 3, scientific = 5) 
formatC(x) 
formatC(x, format = "fg") 
formatC(x, format = "fg", flag = "+") 
+0

謝謝!這確實是非常豐富的信息,並解決了我的問題。感謝您爲我提供有用的示例。 –

+4

爲了增加一點澄清,'format'和'formatC'不會改變數字的打印方式;他們使用指定的格式將數字轉換爲字符。 –

+0

也可以使用'format(x,scientific = F)' – Danny

2

我會建議不要存儲浮點數作爲因素......但你仍然可以做到這一點。但我還包括其他幾個選項。

> txt <- "pNum,Condition,numberEntered 
+ 1,2,5.0970304e+07" 
> dat <- read.csv(textConnection(txt),colClasses=c("integer","integer","factor")) 
> dat 
    pNum Condition numberEntered 
1 1   2 5.0970304e+07 
> dat[,3] 
[1] 5.0970304e+07 
Levels: 5.0970304e+07 
> dat <- read.csv(textConnection(txt),colClasses=c("integer","integer","character")) 
> dat[,3] 
[1] "5.0970304e+07" 
> dat <- read.csv(textConnection(txt),colClasses=c("integer","integer","numeric")) 
> dat[,3] 
[1] 50970304 
> print.numeric <- function(...) formatC(...,format="f") 
> print(dat[,3]) 
[1] "50970304.0000" 
3

很抱歉地說,但您一直在花時間嘗試修復一個不存在的問題。使用str檢查data.frame中的數據類型,您會看到numberEnterednum,並且沒有被「縮短」。唯一的問題是有效數字的數量是印刷

options(digits=7) 
(x <- data.frame(pNum=1,Condition=2,numberEntered=509703045845)) 
options(digits=10) 
x 

您可以使用options(digits=22)將其設置爲打印顯著的最大位數。有關更多信息,請參閱?options

+0

感謝您的答覆。我受夠了這種數字選項有點玩耍了,但我懷疑我不理解這一點。這些數字將在之間的長度變化2和8在那個列,所以我不知道該怎麼設置數字值。我需要它顯示2.139而不是2.139000 0e + 00和3924.75而不是3.9247500e + 03(這是使用選項後顯示的內容(digits = 8) –

+2

看起來這可能是'options(scipen)'的問題。 –

+0

謝謝!就是這個! –

相關問題