因子列上的sum(。)返回不正确的结果

时间:2014-04-21 21:56:01

标签: r data.table

我在这里遇到了一个奇怪的问题。我正在使用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"))

此处有两列,PartyCases。两者都具有默认类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]

这很好用!但是,我不确定前两种方法有什么问题。我错过了什么?

1 个答案:

答案 0 :(得分:7)

factor转换为numericinteger的正确方法是通过character。这是因为在内部,因子是整数索引(指向levels向量)。当你告诉R将其转换为numeric时,它只会转换基础索引,而不是尝试转换级别标签。

简短回答:做Cases:=as.numeric(as.character(Cases))

修改:或者,?factor帮助页面建议as.numeric(levels(Cases))[Cases]更有效率。 h / t @Gsee在评论中。