从r中的列表中的循环中保存向量

时间:2015-07-30 14:01:16

标签: r list vector

您好,我从未编辑过我的问题,但我会试一试。代码实际上意味着什么并不是非常重要。对我来说,只保存新列表中的矢量“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

实际上整个代码对我的问题并不那么有趣,因为它有效!我现在为测试[[1]]做了一个例子。但我想要一个for循环(或其他)在“test”中获取所有向量并将所有5个向量“liste”保存在一个新列表中(让我们称之为“trendtest”......无论如何:D)

1 个答案:

答案 0 :(得分:2)

以下将满足您的要求:

  • 删除第trendtest <- list()行。
  • 将代码从x <- diff(S)转到最后一行(仅打印liste的最后一行除外)并将其插入占位符__CODE_HERE__指示的位置。
trendtest <- lapply(test, FUN = function(S) {
  __CODE_HERE__
  return(liste)
})

这是&#34; R方式&#34;做你想做的事。或者,您可以执行以下操作(这更接近您的初始方法,但更少的是&#34; R方式&#34;):

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中保存trendtest无关。