将字符串转换为数字

时间:2011-02-08 09:49:41

标签: string r

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

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

然而,我仍然会得到很高的数字吗?有人有想法吗?

2 个答案:

答案 0 :(得分:121)

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

> 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

一些意见:

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

答案 1 :(得分:10)

正如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 

这是一个很大的改进,但并不总是瓶颈。但是,如果你有一个很大的数据框和很多要转换的列,那就很重要了。