R 数字数据框列按字符串顺序排列不正确
我在数据框中有一些医院数据,从csv读取。我尝试按用户定义的列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)
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)