我在这里遇到了奇怪的问题。我正在使用
这段代码会将数据导入工作区:
这里有两列,
data.table
来完成一个非常常规的任务,但有一些我无法解释的问题。我已经找到了解决问题的方法,但我认为了解这里出了什么问题仍然很重要。这段代码会将数据导入工作区:
library(XML)
library(data.table)
theurl <- "http://goo.gl/hOKW3a"
tables <- readHTMLTable(theurl)
new.Res <- data.table(tables[[2]][4:5][-(1:2),])
suppressWarnings(names(new.Res) <- c("Party","Cases"))
这里有两列,
Party
和Cases
。它们默认的类别都是factor
,但是Cases
应该是numeric
。最终,我只需要每个Party
的Cases
总和。所以像这样做应该可以:new.Res[,sum(Cases), by=Party]
但这并不能得到正确的答案。我认为如果将Cases
的类从factor
更改为numeric
,它就会起作用。所以我尝试了以下操作:
new.Res[,Cases := as.numeric(Cases)]
new.Res[,sum(Cases), by=Party]
但是我得到了相同的错误答案。我意识到问题发生在将 Cases
类从 factor
更改为 numeric
上。因此,我尝试了一种不同的方法,它起作用了:
步骤1:重新初始化数据:
theurl <- "http://goo.gl/hOKW3a"
tables <- readHTMLTable(theurl)
new.Res <- data.table(tables[[2]][4:5][-(1:2),])
suppressWarnings(names(new.Res) <- c("Party","Cases"))
步骤2:使用不同的方法将类别从因子
更改为数值型
:
new.Res[,Cases := strtoi(Cases)]
new.Res[,sum(Cases), by=Party]
这个方法可以正常工作!然而,我不确定前两种方法出了什么问题。我漏掉了什么吗?
?factor
中提到:“为了将因子f
转换为其原始数值的近似值,建议使用as.numeric(levels(f))[f]
,这比as.numeric(as.character(f))
稍微更有效率一些。” - GSee