R 数字数据框列按字符串顺序排列不正确

R 数字数据框列按字符串顺序排列不正确,r,dataframe,R,Dataframe,我在数据框中有一些医院数据,从csv读取。我尝试按用户定义的列col排序数据帧,然后按医院名称排序,如下所示: col <- 'Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia' hospitals.sorted <- hospitals[order(hospitals[,col], hospitals$Hospital.Name),] 只需确认该列实际上是数字: > sapply(hospitals, mode)

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

col <- 'Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia'
hospitals.sorted <- hospitals[order(hospitals[,col], hospitals$Hospital.Name),]
只需确认该列实际上是数字:

> sapply(hospitals, mode)
Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia 
"numeric" 
Hospital.Name 
"numeric"
我不知道为什么
医院。名字
是数字,而它显然不是

其他我尝试过但没有成功的事情:

  • 使用
    作为.numeric(hospitals[,col])
    订单中
  • 排序前删除“不可用”值

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

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

同样地,
mode()
调用也在欺骗您。考虑

> mode(factor(c(1:10, "a")))
[1] "numeric"
但这显然不是“数字”数据。下一步考虑

> mode(factor(letters))
[1] "numeric"
这掩盖了一个事实,即内部R的因子存储为数字变量,这就是
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记录变量的类型

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

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