如何为R中的排序方法指定比较/关键方法?

时间:2011-09-14 12:15:37

标签: r sorting

在Python中,您可以使用key = ...来指定用于在排序时比较项目的键。 在R中是否有类似的方法?

3 个答案:

答案 0 :(得分:3)

让我延伸里奇的优秀答案。

如果您想获得任何密钥的顺序,order是您正在查看的功能。以Richie为例:

id <- order(tolower(x))
x[id] # gives you the original ordered vector

如果您需要特定按键,则必须查看有序因子。假设您想按照小,大,最大的系列进行观察。

我们创建了一个数据框:

x <- data.frame(V1=1:10,
        V2=sample(c("small","bigger","biggest"),10,TRUE)
     )

现在您可以使用以下方式订购:

id <- order(ordered(x$V2,levels=c("small","bigger","biggest")))
x[id,]

函数ordered()根据您指定的级别使因子x $ V2成为有序因子。 order()为您提供此有序向量的顺序。您可以使用该订单对数据框x进行排序。

如果你想首先在V2上然后在V1上排序,你也可以给出多个参数来订购:

id <- order(ordered(x$V2,levels=c("small","bigger","biggest")),x$V1)
x[id,]

关于你的问题:Richie表示,你不需要lambda表达式。通过x[order(tolower(x))],您实际使用的内容相当于sort(x, key=lambda x:tolower(x) )

再举一个例子,假设你有一个向量列表,你想对第二个值进行排序。你会在python中使用类似sort(x, key = lamda x:x[2] )的东西,对吗?在R中,您必须将一个函数应用于列表,并在order命令中使用它:

x <- list(x1=1:10,x2=10:1,x3=rep(5,10))
id <- order(sapply(x,function(i)i[3]))
x[id]

常规方法

在R中,构造密钥并使用该密钥的顺序作为原始对象的索引。 order函数为您提供了一个简单的界面,可以同时对多个键进行排序。这允许您构造最复杂的排序键。

答案 1 :(得分:2)

看看这些python key sort示例,似乎有两件事你可能想要在R中使用密钥。

首先,将函数应用于要排序的向量的每个元素。

x <- c("clementine", "APPLE", "Banana")

在R中,你只需嵌套函数调用。

所以而不是

sort(x, key = tolower)
你会写

sort(tolower(x))

另一种情况是按特定列对数据帧进行排序。

dfr <- data.frame(x = c(1, 4, 2, 5, 3), y = letters[c(5, 2, 1, 4, 3)])

而不是

sort(dfr, key = function(row) row[2])
你会写

o <- with(dfr, order(y))
dfr[o,]

答案 2 :(得分:1)

sort函数默认按升序返回向量元素,但不包含任何NA。 order函数返回一个带有唯一元素的数字向量,这些元素以递增顺序指定元素的位置,并将NA保留在末尾。很多时候,用户选择order函数来“排序”数据框和向量,因为长度会被保留。

 temp=sample(1:10, 15, replace=TRUE)
 temp[c(3,12)] <- NA
 sort(temp)
# [1]  2  3  3  4  6  7  7  7  8  9  9 10 10
 order(temp)
# [1] 15  2 14  4 13  7  8 10 11  1  6  5  9  3 12
 temp
# [1]  9  3 NA  4 10  9  7  7 10  7  8 NA  6  3  2
 temp[ order(temp) ]
# [1]  2  3  3  4  6  7  7  7  8  9  9 10 10 NA NA

要修改默认的数字或字母排序顺序,我们可以将参数包含在顺序内的参数中,如果传递了多个参数,则可以是多级排序。