我在这里遇到了一个奇怪的问题。我正在使用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
。最终,我只希望每个Cases
的总和为Party
。所以这样的事情应该有效:
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步:使用其他方法将课程从factor
更改为numeric
:
new.Res[,Cases := strtoi(Cases)]
new.Res[,sum(Cases), by=Party]
这很好用!但是,我不确定前两种方法有什么问题。我错过了什么?
答案 0 :(得分:7)
从factor
转换为numeric
或integer
的正确方法是通过character
。这是因为在内部,因子是整数索引(指向levels
向量)。当你告诉R将其转换为numeric
时,它只会转换基础索引,而不是尝试转换级别标签。
简短回答:做Cases:=as.numeric(as.character(Cases))
。
修改:或者,?factor
帮助页面建议as.numeric(levels(Cases))[Cases]
更有效率。 h / t @Gsee在评论中。