我有一个带有段落编号的简单表:
> 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
,然后应用多列排序),是我不知道输出中可能有多少个点 - 金额可能会不时变化。
答案 0 :(得分: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),等等on(在实践中使用100就足够了但你也可以使用更大的数字),因此它们的和是所需的整数,而ro
是它们的向量。