簡體   English   中英

如何基於R中的列表對向量進行排序

[英]How to sort a vector based on a list in R

例如,我有矢量

x=c(-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1).

以及以下列表:

Y =
list(1:7, 8:11, 12:15, 16:19)

如何基於列表Y對向量x進行排序? 我的意思是在同一時間對前7個元素,后4個,后4個和后4個元素進行排序。

所需的輸出應為c(-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1)

請注意,列表Y並不總是相同的。

我嘗試使用x[unlist(sapply(Y, sort))] ,但是它不起作用。

你有什么選擇嗎?

unlist(lapply(lapply(Y, function(i) x[i]), sort))
# [1] -1 -1 -1 -1  1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1

這首先根據Y的索引將x的元素提取到不同的列表項中,其中

lapply(Y, function(i) x[i])

然后它使用lapply(..., sort)獨立地對每個lapply(..., sort) ,然后將它們重新組合成帶有unlist的向量。


使用此輸入:

x = c(-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1)
Y = list(1:7, 8:11, 12:15, 16:19)

不確定這是否是您要的

> unlist(lapply(y, function(z) sort(x[z])))
 [1] -1 -1 -1 -1  1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1

輸入項

x <- c(-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1)
y <- list(1:7, 8:11, 12:15, 16:19)

您還可以避免循環,並同時使用xY對向量進行矢量化處理(因為在平局的情況下, order允許按兩個向量進行排序)

x[order(rep(seq_along(Y), lengths(Y)), x)]
# [1] -1 -1 -1 -1  1  1  1 -1 -1  1  1 -1 -1  1  1 -1 -1  1  1

一些說明基准

set.seed(123)
N <- 1e5
x <- sample(N) 
Y <- split(1:N, rep(1 : (N/5), each = 5))


microbenchmark::microbenchmark("Gregor" = unlist(lapply(lapply(Y, function(i) x[i]), sort)),
                               "Frank1" = ave(x, stack(setNames(Y, seq_along(Y)))$ind, FUN = sort),
                               "Frank2" = x[order(stack(setNames(Y, seq_along(Y)))$ind, x)],
                               "Jilber" =  unlist(lapply(Y, function(z) sort(x[z]))),
                               "David" = x[order(rep(seq_along(Y), lengths(Y)), x)])


# Unit: milliseconds
#   expr        min         lq       mean     median         uq         max neval cld
# Gregor 904.277546 937.652137 958.911977 949.311012 961.324917 1164.024555   100   c
# Frank1 884.306262 922.496558 956.408754 941.394433 962.098976 1140.254656   100   c
# Frank2  27.384839  28.587845  30.806481  29.542219  31.684239   46.947814   100  b 
# Jilber 923.135901 949.318532 967.981792 962.090176 976.574574 1137.115863   100   c
# David   2.184901   2.326817   2.622338   2.492732   2.524091    8.586322   100 a  

向量化解決方案比循環快X500

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM