将string转换为数字

我导入了一个testing文件,并尝试制作一个直方图

pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t") hist <- as.numeric(pichman$WS) 

但是,我从数据集中得到了不同的值。 本来我以为这是因为我有文字,所以我删除了文字:

 table(pichman$WS) ws <- pichman$WS[pichman$WS!="Down" & pichman$WS!="NoData"] 

但是,我仍然是非常高的数字有没有人有一个想法?

我怀疑你有一个因素的问题。 例如,

 > x = factor(4:8) > x [1] 4 5 6 7 8 Levels: 4 5 6 7 8 > as.numeric(x) [1] 1 2 3 4 5 > as.numeric(as.character(x)) [1] 4 5 6 7 8 

一些评论:

  • 你提到你的vector包含字符“下”和“无数据”。 什么期望/希望as.numeric与这些值做?
  • read.csv ,尝试使用参数stringsAsFactors=FALSE
  • 你确定它是sep="/t而不是sep="\t"
  • 使用命令head(pitchman)检查数据的前几行
  • 另外,当你不提供数据时,猜测你的问题是非常棘手的。 一个最小的工作例子总是可取的。 例如,我无法运行命令pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t")因为我无法访问数据集。

正如csgillespie所说。 stringsAsFactors默认为TRUE,将任何文本转换为一个因子。 所以即使在删除文本之后,您的数据框中仍然有一个因素。

现在关于转换,有一个更好的方法来做到这一点。 所以我把它作为参考:

 > x <- factor(sample(4:8,10,replace=T)) > x [1] 6 4 8 6 7 6 8 5 8 4 Levels: 4 5 6 7 8 > as.numeric(levels(x))[x] [1] 6 4 8 6 7 6 8 5 8 4 

显示它的作品。

时间:

 > x <- factor(sample(4:8,500000,replace=T)) > system.time(as.numeric(as.character(x))) user system elapsed 0.11 0.00 0.11 > system.time(as.numeric(levels(x))[x]) user system elapsed 0 0 0 

这是一个很大的改进,但并不总是一个瓶颈。 但是,如果你有一个大的数据框和大量的列进行转换,它就变得非常重要。

我遇到了一个类似的问题,恢复列表输出从例程到matrix….出于某种原因,它不是作为数字数据input; 因此,我一直在使用for循环例程来使用as.numeric()将“弦”数字转换为数字格式,例如

 for(i in 1:20){ for(j in 1:6){ x[i,j]=as.numeric(y[i,j]) } } 

不知道为什么我不能这样做:

 x=as.numeric(y) 

但它不起作用。