将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)
但它不起作用。