【问题标题】:saving vectors from a loop in a list in r将循环中的向量保存在 r 中的列表中
【发布时间】:2015-07-30 14:01:15
【问题描述】:

您好,我从未编辑过我的问题,但我会试一试。代码的实际含义并不是非常重要。对我来说,仅将向量“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 循环(或其他)在“测试”中获取所有向量,并将所有 5 个向量“列表”保存在一个新列表中(让我们称之为“趋势测试”......无论如何:D)

【问题讨论】:

  • trendtest的结构是什么?长度为 list 的列表列表,其中每个元素由 liste 组成?
  • 没有。 “trendtest”是一个列表,包含所有不同的向量“liste”。它具有与“list”完全相同的条目数量,因为每个 list[[u]] 创建一个特定的向量“liste”。
  • 你不能在你的for循环trendtest &lt;- list()之前初始化trendtest,然后在while之后做trendtest[[u]] &lt;- liste,在你的代码中,你的lapply将只返回一个列表,其中每个元素是最后一个liste
  • 我以前试过这个。它为我提供了包含 2000 个条目的“趋势测试”列表,但除第 2000 个条目之外的所有条目都是“NULL”。只是最后一个是向量(“liste”)
  • 你试过这个吗? trendtest &lt;- lapply(1:length(list), function(u) u&lt;-liste),它使用 liste 的元素创建一个长度(列表)列表(在我的模型数据中),但它的大小可能是原来的两倍?

标签: r list vector


【解决方案1】:

以下将满足您的要求:

  • 删除trendtest &lt;- list()这一行。
  • 将代码从x &lt;- diff(S) 取出到最后一行(除了只打印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 保存在trendtest 中无关。

【讨论】:

  • @ user2706569:对不起,我不是这样的专业人士:D 我不太明白这一点。我是否可以通过 PM 将 .txt 文件中的代码发送给您,然后您看一下?你会在一秒钟内看到问题......毕竟我认为这只是一个小问题
  • Stack Overflow 上没有 PM。但是,如果这不能解决您的问题,那么您可以 a) 就您不理解的问题提出问题(在 cmets 中)或 b) 用 minimal, complete, verifiable example 修改您的问题(另请参阅 R specific version)。
  • @FloChi 我更新了我的答案以回应编辑后的问题。
猜你喜欢
  • 2018-07-27
  • 2019-12-08
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
相关资源
最近更新 更多