如何按字母顺序对列表进行排序?

3

需要创建一个随机字母表,并按字母顺序对其进行排序。为了创建这样的列表,我使用以下代码:

# Creating a random vector of letters
random_text_data = sample(letters, 10)
random_text_data

# Convert to list
list_text_data = as.list(random_text_data)
list_text_data

在控制台中,我得到以下内容:

> random_text_data
 [1] "h" "m" "q" "b" "z" "i" "y" "f" "d" "e"
> # Convert to list
> list_text_data = as.list(random_text_data)
> list_text_data
[[1]]
[1] "h"

[[2]]
[1] "m"

[[3]]
[1] "q"

[[4]]
[1] "b"

[[5]]
[1] "z"

[[6]]
[1] "i"

[[7]]
[1] "y"

[[8]]
[1] "f"

[[9]]
[1] "d"

[[10]]
[1] "e"

现在我需要按字母顺序对其进行排序。我尝试了以下方法:

# Sort list alphabetically
sort_data = sort(list_text_data)

但是出现错误:

> sort_data = sort(list_text_data)
Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : 
'x' must be elementary

你应该如何进行排序?


3
每个列表项只有1个字符?为什么不将其转化为无序列表,然后再转换回来成为有序列表呢? - zx8754
1
as.list(sort(unlist(list_text_data))) - Maël
@zx8754,是的,这样做很合乎逻辑,但任务就是这样设定的:“创建一个拉丁字母列表。按字母顺序排序”。 - kostya ivanov
我认为他们可能是指向量,而不是列表对象。 - zx8754
@zx8754,我可能会采用这种方法,希望他们能够计数。谢谢。 - kostya ivanov
3个回答

3

这里有一个不需要使用unlist()的方法。在创建包含随机字母的列表后,使用列表内容为列表分配名称。然后按照列表中的名称排序。

输入

random_text_data = sample(letters, 10)

[1] "c" "v" "m" "g" "h" "l" "d" "i" "u" "y"

原始解决方案

list_text_data = as.list(random_text_data)

list_text_data <- setNames(list_text_data, list_text_data)

list_text_data[order(names(list_text_data))]

$c
[1] "c"

$d
[1] "d"

$g
[1] "g"

$h
[1] "h"

$i
[1] "i"

$l
[1] "l"

$m
[1] "m"

$u
[1] "u"

$v
[1] "v"

$y
[1] "y"

更新的解决方案

根据@zx8754的答案,你实际上不需要更改列表的名称,可以在order中使用setNames,那么输出将是一个未命名的列表。

list_text_data[order(names(setNames(list_text_data, list_text_data)))]

[[1]]
[1] "c"

[[2]]
[1] "d"

[[3]]
[1] "g"

[[4]]
[1] "h"

[[5]]
[1] "i"

[[6]]
[1] "l"

[[7]]
[1] "m"

[[8]]
[1] "u"

[[9]]
[1] "v"

[[10]]
[1] "y"

1
是的,它有效。 - kostya ivanov

3

将字符转换为整数,然后排序:

# reproducible example data
set.seed(1); random_text_data = sample(letters, 3)
list_text_data = as.list(random_text_data)
# [[1]]
# [1] "y"
# 
# [[2]]
# [1] "d"
# 
# [[3]]
# [1] "g"


# sort
list_text_data[ order(sapply(list_text_data, utf8ToInt)) ]
# [[1]]
# [1] "d"
# 
# [[2]]
# [1] "g"
# 
# [[3]]
# [1] "y"

1
我们可能需要在排序元素之前先将列表展平。我们可以尝试以下的sort+unlist方法:
relist(sort(unlist(list_text_data)), list_text_data)

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