10

我在数据框中有一些医院数据,从 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
  • 排序前删除“不可用”值

我可能遗漏了一些基本的东西。哈!

4

1 回答 1

17

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

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

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

然而,这显然不是“数字”数据。接下来考虑

> 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

至于解决办法。“不可用”需要设置为NA。您可以在读取数据时通过添加na.strings = "Not Available"read.table()(或您使用的任何包装器)调用来执行此操作。这应该足以理清字符>因子转换。

最重要的提示是始终查看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 排序。
于 2012-10-20T20:43:20.737 回答