对段落编号排序

时间:2018-01-08 12:50:57

标签: r sorting dataframe

我有一个带有段落编号的简单表:

> 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 个答案:

答案 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是它们的向量。