Используйте order()
для этого, так как sort()
удаляет имена при использовании *apply
:
id <- t(apply(Data,1,order))
lapply(1:nrow(id),function(i)Data[i,id[i,]])
Использование результатов order
в матрице идентификаторов также позволяет сделать, например:
matrix(names(Data)[id],ncol=ncol(Data))
[,1] [,2] [,3] [,4] [,5]
[1,] "DIA" "IWM" "SPY" "OIH" "SMH"
[2,] "SMH" "OIH" "SPY" "DIA" "IWM"
[3,] "OIH" "DIA" "SPY" "IWM" "SMH"
[4,] "OIH" "IWM" "SMH" "SPY" "DIA"
[5,] "OIH" "SMH" "SPY" "DIA" "IWM"
[6,] "SMH" "OIH" "IWM" "DIA" "SPY"
Чтобы выяснить, какие из них были лучшими в данный момент.
Если вы хотите использовать свой цикл, вы можете использовать списки. как сказал Иисус, вы перезаписываете s в каждом цикле. Инициализируйте список, чтобы сначала сохранить результаты. Этот цикл дает те же результаты, что и приведенный выше код с lapply()
, но без матрицы id. Нет увеличения скорости, хотя применение apply имеет и другие преимущества:
N <- nrow(Data)
s <- vector("list",N)
for (i in 1:N) {
s[[i]] <- sort(Data[i,])
}
Я протестировал код, используя следующие примеры данных (пожалуйста, укажите свои собственные в будущем, используя либо этот пример, либо, например, dput()
):
zz <- textConnection(" SPY DIA IWM SMH OIH
8.1985485 7.8349806 7.935566 21.223832 13.975655
-0.5621328 1.7198760 2.141846 -10.904936 -4.565291
-2.6957979 -3.5838102 2.786250 4.671762 -23.241009
-1.0248091 -0.1997433 -5.725078 -3.354391 -9.161594
-6.1165559 -5.0276558 -2.461728 -6.218129 -13.956695
-8.8900629 -12.2663267 -15.760037 -39.321172 -16.902913 ")
Data <- read.table(zz,header=T)
close(zz)