我需要在 R 中復制以下排序行為(在 Python 中找到)。
假設在 Python 中:
l = [(0,0), (1,-1), (-1,0), (-1,-1)]
>>> sorted(l)
[(-1, -1), (-1, 0), (0, 0), (1, -1)]
>>> min(l)
[(-1, -1)]
R 中的等效資料結構是:
l <- list(c(0,0), c(1,-1), c(-1,0), c(-1,-1))
的sort()和sort.list()方法并不對非原子矢量來實作。
在我的用例中,我可以保證一個長度為 2 的向量串列,所以這是有效的:
sorted <- function(list){
m=matrix(unlist(list), ncol = 2, byrow = T)
asplit(
m[order(m[,1],m[,2]),],
1
)
}
復制minPython的行為很容易,只依賴sorted于 R 中實作的正確功能。
min.list <- function(list) sorted(list)[1]
sorted非常感謝有關實施相同行為的建議,特別歡迎對效率的考慮。
對我的實作來說是不必要的,但額外的考慮是sorted當子串列長度不同時的行為。
>>> sorted([(0,0), (1,1), (0,-1), (0,-1, 0), (0,-1,-1), (0, 0, 0)])
[(0, -1), (0, -1, -1), (0, -1, 0), (0, 0), (0, 0, 0), (1, 1)]
提前致謝
uj5u.com熱心網友回復:
一種選擇是行系結到矩陣,按列拆分并用于order()獲取索引。對于參差不齊的資料,首先需要對長度進行標準化,但如果保證資料長度相等,顯然可以跳過這一步以稍微提高效率。
l <- list(c(0, 0), c(1, 1), c(0, -1), c(0, -1, 0), c(0, -1, -1), c(0, 0, 0))
l[do.call(order, c(asplit(do.call(rbind, lapply(l,
`length<-`, max(lengths(l)))), 2), na.last = FALSE))]
[[1]]
[1] 0 -1
[[2]]
[1] 0 -1 -1
[[3]]
[1] 0 -1 0
[[4]]
[1] 0 0
[[5]]
[1] 0 0 0
[[6]]
[1] 1 1
uj5u.com熱心網友回復:
也許我們可以試試這種方式
> l <- list(c(0, 0), c(1, 1), c(0, -1), c(0, -1, 0), c(0, -1, -1), c(0, 0, 0))
> l[order(sapply(l, toString))]
[[1]]
[1] 0 -1
[[2]]
[1] 0 -1 -1
[[3]]
[1] 0 -1 0
[[4]]
[1] 0 0
[[5]]
[1] 0 0 0
[[6]]
[1] 1 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/384821.html
上一篇:在圖中正確排序月份
