R语言中为数据框列加标签后order()排序行为改变的原因
为什么给数据框列加标签会改变order()的排序结果?
核心原因:字符向量的排序规则差异,以及自定义类对radix排序的限制
未加标签时的两种排序逻辑
你的df$name默认是纯字符向量(R 4.0及以上版本默认stringsAsFactors=FALSE):- 用
method="radix"排序:radix是基于ASCII字节值的严格排序。大写字母的ASCII值(65-90)比小写字母(97-122)小,"COVID"的第二个字符是大写O(ASCII 79),而"Constipation"的第二个字符是小写o(ASCII 111),所以"COVID"会排在前面。 - 默认排序(不指定method):会遵循系统的本地化(locale)规则,通常忽略大小写按字母排序。此时"Constipation"的第三个字符是n,"COVID"的第三个是V,n在字母顺序中早于V,所以"Constipation"排在首位。
- 用
添加标签后的变化
你使用的label()函数(来自Hmisc包)会给df$name加上labelled的自定义类属性,此时它不再是纯字符向量。order()的radix排序方法仅支持原生原子向量(纯字符、整数、逻辑等),无法处理带自定义类的向量。传入带labelled类的向量时,radix方法会自动回退到locale规则的排序逻辑,所以无论是否指定method="radix",结果都会和默认排序一致,即"Constipation"排在前面。
验证代码
# 查看未加标签时的向量类型 df <- data.frame(name=c("COVID","Constipation"),loc=c("USA","GBR")) class(df$name) # 输出:[1] "character" # 查看两个字符串的ASCII字节值 charToRaw("COVID") # 输出:[1] 43 4f 56 49 44 charToRaw("Constipation") # 输出:[1] 43 6f 6e 73 74 69 70 61 74 69 6f 6e # 添加标签后查看向量类型 library(Hmisc) label(df$name) <- "Name of the disease" class(df$name) # 输出:[1] "labelled" "character"
内容的提问来源于stack exchange,提问作者HY KB
相关产品推荐
相关产品推荐

