对段落编号进行排序

6

我有一个简单的表格,其中包含段落编号:

> table <- data.frame(id=c(1,2,3,4,5,6,7,8,9), paragraph=c("1.1.1.1","1","2","1.1","100","1.2","10","1.1.1","1.1.2"))
> print(table)

id paragraph
1   1.1.1.1
2         1
3         2
4       1.1
5       100
6       1.2
7        10
8     1.1.1
9     1.1.2
10     1.10

我希望按照这种方式排序:
id paragraph
2         1
4       1.1
8     1.1.1
1   1.1.1.1
9     1.1.2
6       1.2
10     1.10
3         2
7        10
5       100

对我来说问题在于(我可能可以通过 . 将它们分割为 data.frame ,然后应用多列排序),我不知道输出中会有多少个点 - 数量可能会随时变化。


1
gtools::mixedsort 不太起作用。噢,算了。 - Ben Bolker
1
@BenBolker 你需要使用 gtools::mixedorder - Jaap
1
不,gtools::mixed****在这种情况下实际上不能按照OP的要求工作——它们会将1.1.1.1排在1.1.1之前......这不是标准的混合字典/数字排序问题。建议重新开放。 - Ben Bolker
1
你的排序正确吗?1.1.1.1 不应该在 1.1.2 之上吗? - Sotos
@Sotos,没错,感谢指出错误! - Kirill
1个回答

2
这里有一个选项:
sp <- strsplit(as.character(table$paragraph), "\\.")
ro <- sapply(sp, function(x) sum(as.numeric(x) * 100^(max(lengths(sp)) + 0:(1 - length(x)))))
table[order(ro), ]
#    id paragraph
# 2   2         1
# 4   4       1.1
# 8   8     1.1.1
# 1   1   1.1.1.1
# 9   9     1.1.2
# 6   6       1.2
# 10 10      1.10
# 3   3         2
# 7   7        10
# 5   5       100

显然,级别结构不能忽略,在处理 sp 时,我首先将段落编号进行拆分。接下来,为了将段落编号转换成整数并保持其顺序,对于每个段落编号,我将该部分的数字乘以100^n(对于特定的n),子部分乘以100^(n-1),依此类推(在实践中使用100应该足够,但也可以使用更大的数字),这样它们的和就是所需的整数,ro 是它们的向量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接