我在数据框中有一些医院数据,从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
我可能会遗漏一些基本的东西。 HALP!
答案 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。
注意变量的类型关于你尝试过的其他事情:
as.numeric(hospitals[,col])
将生成包含因子每个元素的级别ID的数字向量。如果因子按特定顺序排序,那么它的级别表示也会排序。要将一个因子(它的标记版本)转换为数字,您需要一个中间步骤:as.numeric(as.character(hospitals[, col]))
。这不会解决你在这里遇到的实际问题,因为你在变量中有字符数据而R不能将它转换为数字。它会将"Not Available"
转换为NA
,如果您尝试as.numeric(as.character(hospitals[, col]))
,这可能会有效。"Not Available"
,我假设通过删除那些行/元素?,仍然会将剩余的观察结果留在一个因子中。出于上述原因,它不会起作用,因为它会对标签/级别进行alpha排序。