在Python中,您可以使用key = ...来指定用于在排序时比较项目的键。 在R中是否有类似的方法?
答案 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
要修改默认的数字或字母排序顺序,我们可以将参数包含在顺序内的参数中,如果传递了多个参数,则可以是多级排序。