data.table含反引号字符串排序与base R不符,属Bug还是特性?
data.table含反引号字符串排序差异:Bug还是特性?
当字符列包含反引号时,data.table的order()排序结果与base R出现明显差异:
- 无反引号的字符列,二者均按字符串字典序排序,得到
"1"→"10"→"2"的结果 - 带反引号的字符列,base R仍按字符串字面量的字典序排序(
"1"→"10"→"2"),但data.table的排序结果变为"10"→"1"→"2",不符合常规预期。
以下是复现代码:
library(data.table) # 无反引号的字符列排序 data.table(v1 = c("2", "1", "10"))[order(v1)] #> v1 #> 1: 1 #> 2: 10 #> 3: 2 # 带反引号的字符列排序(data.table) data.table(v1 = c("`2`", "`1`", "`10`"))[order(v1)] #> v1 #> 1: `10` #> 2: `1` #> 3: `2` # 无反引号的字符列排序(base R) c("2", "1", "10")[order(c("2", "1", "10"))] #> [1] "1" "10" "2" # 带反引号的字符列排序(base R) c("`2`", "`1`", "`10`")[order(c("`2`", "`1`", "`10`"))] #> [1] "`1`" "`10`" "`2`"
Created on 2023-05-25 with reprex v2.0.2
这是data.table的特性,属于设计层面的特殊处理:data.table的order()函数会尝试对字符列进行智能解析,当字符串被反引号包裹时,会将其识别为R语言中的符号(symbol),而非普通字符串。符号的排序规则基于R内部的存储逻辑,和普通字符串的字典序不同,因此导致了排序结果的差异。base R的order()则始终严格按字符串字面量的ASCII码顺序排序,因此结果符合常规预期。
如果需要让data.table按字符串字面量排序,只需显式将列转为字符型后排序:
data.table(v1 = c("`2`", "`1`", "`10`"))[order(as.character(v1))] #> v1 #> 1: `1` #> 2: `10` #> 3: `2`
内容的提问来源于stack exchange,提问作者cach1
相关产品推荐
相关产品推荐

