簡體   English   中英

將循環中的向量保存到r的列表中

[英]saving vectors from a loop in a list in r

嗨,我從未編輯過我的問題,但我會嘗試一下。 代碼的實際含義並不是很重要。 對我來說,僅將矢量“ liste”保存在新列表中是有意義的:D

test <- list()
test <- replicate(5, sample(1:100, 50), simplify = FALSE)  # Creates a list of 5 vectors
> test[[1]]
[1]  90  96  20  86  32  77  83  33  64  29  88  97  78  81  40  60  89  19  31  59  26  38  34  71   5  80  85
[28]   3  70  87  41  50   6  18  37  58   9  76  91  62  12  30  42  94  72  95 100  10  68  82

S <- test[[1]]

x <- diff(S)   # following algorythm creates "liste" (vector) for test [[1]]
trendtest <- list()
k <- NULL                          
d <- NULL                                
t <- vector("list",length(x))
A <- vector("list",length(x)) 
z <- vector("list",length(x)-2)
za <- vector("list",length(x)-2)
liste <- NULL
dreisum <- sapply(1:(length(x)-2), function(i) sum(x[c(i,(i+1))]))
dreisumi <- lapply(1:(length(x)-2), function(i) dreisum[i:(length(x)-2)]) 
zdreisumi<- lapply(1:(length(x)-4), function(i) dreisumi[[i]]  [3:length(dreisumi[[i]])]<0)
zadreisumi<- lapply(1:(length(S)-4), function(i) dreisumi[[i]][3:length(dreisumi[[i]])]>0)
Si <- lapply(1:(length(x)-2), function(i) S[i:(length(x))])  
i <- 1
h <- 1
while(i<(length(x)-3) & h!=Inf){                   
k <- c(k,k <- (S[i]-S[i+2])/(-2))
d <- c(d,d <- (S[i+2]*i-S[i]*(i+2))/(-2))
t[[i]] <- i:(length(x))
A[[i]] <- k[length(liste)+1]*t[[i]]+d[length(liste)+1]
A[[i]][3] <- S[i+2]
z[[i]] <- Si[[i]][3:length(Si[[i]])]<A[[i]][3:length(A[[i]])]
za[[i]] <- Si[[i]][3:length(Si[[i]])]>A[[i]][3:length(A[[i]])]

if(k[length(liste)+1]>0 & S[i+3]>A[[i]][4] & is.element(TRUE,z[[i]])){h <- (min(which(z[[i]]!=FALSE))+1)}else{
     if(k[length(liste)+1]>0 & S[i+3]<A[[i]][4] & is.element(TRUE,za[[i]])){h <- (min(which(za[[i]]!=FALSE))+1)}else{
         if(k[length(liste)+1]<0 & S[i+3]>A[[i]][4] & is.element(TRUE,z[[i]])){h <- (min(which(z[[i]]!=FALSE))+1)}else{
            if(k[length(liste)+1]<0 & S[i+3]<A[[i]][4] & is.element(TRUE,za[[i]])){h <- (min(which(za[[i]]!=FALSE))+1)}else{
                if(k[length(liste)+1]>0 & S[i+3]>A[[i]][4] & (all(z[[i]]==FALSE))){h <- (min(which(zdreisumi[[i]]!=FALSE))+2)}else{
                    if(k[length(liste)+1]>0 & S[i+3]<A[[i]][4] & (all(za[[i]]==FALSE))){h <- (min(which(zdreisumi[[i]]!=FALSE))+2)}else{
                         if(k[length(liste)+1]<0 & S[i+3]>A[[i]][4] & (all(z[[i]]==FALSE))){h <- (min(which(zadreisumi[[i]]!=FALSE))+2)}else{
                             if(k[length(liste)+1]<0 & S[i+3]<A[[i]][4] & (all(za[[i]]==FALSE))){h <- (min(which(zadreisumi[[i]]!=FALSE))+2)}}}}}}}}
liste <- c(liste,i)
 i <- i+h-1   
 if((length(x)-3)<=i & i<=length(x)){liste <- c(liste,i)}}

 > liste
 [1]  1  3  7 10 12 16 18 20 24 27 30 33 36 39 41 46

實際上,整個代碼對於我的問題並不是那么有趣,因為它可以工作! 我現在為test [[1]]做例子。 但是我想要一個for循環(或其他任何形式)將所有向量都保存在“ test”中,並將所有5個向量“ liste”保存在一個新列表中(我們稱其為“ trendtest” ...無論是什么:D)

以下將滿足您的要求:

  • 刪除trendtest <- list()
  • 將代碼從x <- diff(S) liste x <- diff(S)移到最后一行(僅打印liste最后一行liste ),並將其插入占位符__CODE_HERE__指示的位置。
trendtest <- lapply(test, FUN = function(S) {
  __CODE_HERE__
  return(liste)
})

這是您想要做的“ R方式”。 另外,您可以執行以下操作(與您的初始方法更接近,但較少使用“ R方式”):

trendtest <- vector("list", length(test))

for (u in 1:length(test)) { # better: u in seq_along(test)
    S <- test[[u]]

    __CODE_HERE__

    trendtest[[u]] <- liste
}

請注意,將出現一條錯誤消息,該錯誤消息是由於樣本數據(不適合所提供的算法)引起的,與將liste保存在trendtesttrendtest

暫無
暫無

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

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