在R中将科学计数法中的逗号替换为点

3
我希望读取一个使用科学计数法和逗号作为小数分隔符的csv文件,并将其转换成数据框或向量。然后,我想使用这些数据进行进一步的计算。问题在于,R不会将数据识别为数字。如何将逗号表示的科学计数法翻译成点表示的“正确”科学计数法,以便我可以将其用作数字值?
我尝试了以下代码: mferg_1<-read.csv("file.csv",sep=";",dec=",",header=FALSE) 当我查看数据框 mferg_1 时,出现以下情况(摘录):
          V2        V3        V4        V5
14 3,063E+01 1,775E-02 6,641E-07 3,747E-02

我认为我可以使用gsubsub来替换逗号:

mferg_1<-sub(",", ".", mferg_1)

但是此时的mferg_1看起来像这样:

[1] "425" "388" "535" "472"

我担心解决这个问题有一种简单的方法,但我还没有找到它。


我使用了dec=","。然而数据框中的数据显示为逗号而不是点。read.csv2 也没有更好的效果。 - curbholes
当我使用read.csv或者read.csv2(设置适当的参数)读取与你的值完全相同的文件时,它可以正常工作。我的最佳猜测是你的文件中可能有其他奇怪的字符。 - joran
1个回答

7
您的csv中可能有一些字符行,这些字符行不允许将列转换为数字,因为dec = ","参数应该是有效的。请看下面使用您的数据的示例:
text <- "3,063E+01 1,775E-02 6,641E-07 3,747E-02"
read.table(text=text, dec = ",")
     V1      V2        V3      V4
1 30.63 0.01775 6.641e-07 0.03747

现在,如果您无法确定问题(找出什么阻止R将您的列识别为数字),则可以使用gsub

df <- read.table(text=text)
df <- sapply(df, gsub, pattern = ",", replacement= ".")
df <- sapply(df, as.numeric)
     V1        V2        V3        V4 
3.063e+01 1.775e-02 6.641e-07 3.747e-02 

可以了,谢谢!不过我还是不明白为什么一开始用gsub的时候它没起作用。 - curbholes
gsub 会尝试将其输入转换为字符。如果您将整个 data.frame 作为输入传递,当列为 factors 时(这可能是您的情况),它可能会产生“意外”的行为。但是,如果没有完整的数据,我无法确定您的问题所在。祝一切顺利。 - Carlos Cinelli
未来的读者应该注意,如果您没有捕捉到导致列被读取为字符的所有“问题”字符,在应用as.numeric之前修复这些问题,会生成NA - joran

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