数字数据框列不正确地作为字符串排序

时间:2012-10-20 20:30:43

标签: r dataframe

我在数据框中有一些医院数据,从csv读入。我尝试按用户定义的列col排序数据框,然后按医院的名称排序:

col <- 'Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia'
hospitals.sorted <- hospitals[order(hospitals[,col], hospitals$Hospital.Name),]

但我觉得我错过了一些东西;它似乎对col字符串进行排序:

> hospitals.sorted
... # so far so good # ...
2749                                                   10.0
2831                                                   10.0
2891                                                   10.0
2837                                                   10.1
2824                                                   10.1
2774                                                   10.1
... # not so good # ...
2856                                                   15.7
2834                                                   15.9
2797                                                   16.0
2835                                                    7.4
2850                                                    7.7
2789                                                    8.1
... # there are some non-numeric values at the very bottom # ...
2806                                                    9.9
2867                                                    9.9
2884                                                    9.9
2808                                          Not Available
2913                                          Not Available
2911                                          Not Available

只是确认该列实际上是数字:

> sapply(hospitals, mode)
Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia 
"numeric" 
Hospital.Name 
"numeric"

我不知道为什么Hospital.Name是数字,但显然不是。

我尝试的其他事情无济于事:

  • as.numeric(hospitals[,col])
  • 中使用order
  • 删除&#34;不可用&#34;排序前的值

我可能会遗漏一些基本的东西。 HALP!

1 个答案:

答案 0 :(得分:16)

在数据框中,各个组件必须是原子矢量。您在所提及的变量中包含数字和字符数据,因此R将读取它作为字符向量。但是,由于参数stringsAsFactors的默认设置,字符向量将被转换为因子。因此,它看起来像数字存储为数字。然而,这些只是标签而且你被欺骗了。

同样,mode()电话也欺骗了你。考虑

> mode(factor(c(1:10, "a")))
[1] "numeric"

然而,这显然不是&#34;数字&#34;数据。接下来考虑

> mode(factor(letters))
[1] "numeric"

这掩盖了这样一个事实,即内部R因子被存储为数字变量,这就是mode()告诉你的。 mode()是这项工作的错误工具。

要测试变量是否为数字,请改用is.numeric()

> is.numeric(factor(c(1:10, "a")))
[1] FALSE
> is.numeric(factor(letters))
[1] FALSE

至于解决方案。 &#34;不可用&#34;需要设置为NA。您可以通过将na.strings = "Not Available"添加到read.table()(或您使用的任何包装器)调用来读取数据时执行此操作。这应该足以理清角色&gt;因子转换。

最重要的提示是始终查看应用于对象的str()输出,以检查R是否已根据需要读取数据。所以你应该这样做:

str(hospitals)

并根据R。

注意变量的类型

关于你尝试过的其他事情:

  1. as.numeric(hospitals[,col])将生成包含因子每个元素的级别ID的数字向量。如果因子按特定顺序排序,那么它的级别表示也会排序。要将一个因子(它的标记版本)转换为数字,您需要一个中间步骤:as.numeric(as.character(hospitals[, col]))。这不会解决你在这里遇到的实际问题,因为你在变量中有字符数据而R不能将它转换为数字。它会将"Not Available"转换为NA,如果您尝试as.numeric(as.character(hospitals[, col])),这可能会有效。
  2. 通过删除"Not Available",我假设通过删除那些行/元素?,仍然会将剩余的观察结果留在一个因子中。出于上述原因,它不会起作用,因为它会对标签/级别进行alpha排序。