将字符串转换为数字

eli*_*avs 96 string r

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

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

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

table(pichman$WS)    
ws <- pichman$WS[pichman$WS!="Down" & pichman$WS!="NoData"]    
Run Code Online (Sandbox Code Playgroud)

但是,我仍然得到很高的数字,有没有人有想法?

csg*_*pie 127

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

> 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
Run Code Online (Sandbox Code Playgroud)

一些评论:

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


Jor*_*eys 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
Run Code Online (Sandbox Code Playgroud)

显示它的工作原理.

时间安排:

> 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 
Run Code Online (Sandbox Code Playgroud)

这是一个很大的进步,但并不总是瓶颈.但是,如果您有一个大型数据框和许多要转换的列,这一点很重要.