如何在R数据框中显示数字列而不使用科学计数法('e+07')

12
我有一个R数据框,其中一列包含数字字符串,但我想将它们视为因子(主要为了防止R使用e + 04等方式缩短数字)。我发现解决这个问题的一种方法是编辑csv文件,向所需列添加一个虚拟条目,然后重新导入它。如何使用R函数实现此效果,而不需要操作csv文件呢?
为了澄清,我的数据框看起来像这样:
pNum,Condition,numberEntered
1,2,5.0970304e+07

我想将numberEntered的数据类型从numeric更改为factor,并摆脱讨厌的e+07。

3个回答

30

正如 Joshua 所说,这是一个打印问题而不是存储问题。您可以通过调整 getOption("scipen") 来改变所有数字的打印方式。

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

你也可以选择改变仅这些数字的格式方式。(这将把它们转换为字符。) 值得了解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 = "+")

谢谢!这确实很有帮助,解决了我的问题。感谢您提供有用的示例。 - S Rules
4
为了澄清一点,formatformatC不会改变数字的打印方式;它们使用指定的格式将数字转换为字符。 - Joshua Ulrich
可以将一个数值向量转换为科学计数法而不将其转换为字符吗? - Shadrack Kibet

4
抱歉,但您一直在尝试解决一个不存在的问题。使用str检查您的数据框中的数据类型,您会发现numberEnterednum类型,并且它没有被“缩短”。唯一的问题是打印的有效数字位数。
options(digits=7)
(x <- data.frame(pNum=1,Condition=2,numberEntered=509703045845))
options(digits=10)
x

您可以使用 options(digits=22) 将其设置为打印最大数量的有效数字。有关更多信息,请参见 ?options


感谢您的回复。我已经尝试过 digits 选项,但我怀疑我并不理解它。该列中的数字长度将在2到8之间变化,因此我不确定应将 digits 值设置为多少。我需要它显示 2.139 而不是 2.1390000e+00,以及 3924.75 而不是 3.9247500e+03(这是使用 options(digits=8) 后显示的内容)。 - S Rules
2
这似乎是与 options(scipen) 有关的问题。 - Joshua Ulrich

3

我建议不要将浮点数存储为因子...但是你仍然可以这样做。但我也包括了其他几个选项。

> 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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接