我导入了一个测试文件并尝试制作直方图
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"]
然而,我仍然会得到很高的数字吗?有人有想法吗?
答案 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
一些意见:
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
这是一个很大的改进,但并不总是瓶颈。但是,如果你有一个很大的数据框和很多要转换的列,那就很重要了。