[英]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)
您還可以避免循環,並同時使用x
和Y
對向量進行矢量化處理(因為在平局的情況下, 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.