2016-12-04 36 views
0

每個元素我有一個巨大的名單,以下是trboot6r使用功能與if語句列表

UPDATE的示例:我不想刪除多餘的「1」或「-1」。相反,我想將其更改爲零。我很抱歉

dput() 
structure(list(`1` = c(-1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), `2` = c(-1, 
-1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 
-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1), `3` = c(1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1), `4` = c(-1, 
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, 1), .Names = c("1", "2", "3", "4")) 

把下面僅供說明用途

$ 1 : num [1:39] -1 1 -1 -1 -1 -1 -1 -1 -1 1 ... 
$ 2 : num [1:46] -1 -1 -1 1 1 1 -1 -1 -1 -1 ... 
$ 3 : num [1:48] 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ... 
$ 4 : num [1:43] -1 -1 1 -1 -1 -1 -1 -1 -1 -1 ... 

我想要做的是檢查,如果每個列表中的每對具有1和-1。對在括號中表示如下所示:

$ 1 : num [1:39] (-1 1) (-1 -1) (-1 -1) (-1 -1) (-1 1) ... 
$ 2 : num [1:46] (-1 -1) (-1 1) (1 1) (-1 -1) (-1 -1) ... 
$ 3 : num [1:48] (1 -1) (-1 -1) (-1 -1) (-1 -1) (-1 -1) ... 
$ 4 : num [1:43] (-1 -1) (1 -1) (-1 -1) (-1 -1) (-1 -1) ... 

如果對不具有圖1和-1,那麼,我想第二相同數目改變到零,即如果對是(1 1),我改變第二個1爲零以得到'(1 0)'。如果再有1個,我也改變這個1。然後,如果有一個-1,它將與第一1.

配對以更好的代碼,我使用的總和應該總是-2和2之間保持了對存在的邏輯。 Pair不能是(1,-1)(-1,1)或(1,-1)(1,-1)。所以,如果餘額變< -2或> 2,最新的數字已被刪除。

這裏是我上面的邏輯代碼:

balboot<-0 
fboot<- function(x) { 
    ifelse(x==-1,balboot<-balbbot-1,balboot<-balboot+1) 
    if(balboot==-2){x<-0 
    balboot=-1} 
    if(balboot==2){x<-0 
    balboot=1} 
    return(fboot) 
} 
rdtp<-lapply(trboot6, FUN=fboot) 

運行在此之後,我得到警告:

In if (x == 1) { ... : 
    the condition has length > 1 and only the first element will be used 

預期輸出:

list '1': -1, 1, -1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
list '2': -1, 0, 0, 1, 1, 0, -1, -1,0, 0, 0, 0, 1, 1, -1, -1, 0, 0, 0, 1, 1, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 

感謝您的提前幫助。

+1

請發佈一個可重複使用的示例usign'dput'。此外,而不是'if/else'使用'ifelse',因爲它是矢量化的 – akrun

+0

hello! @akrun我在問題開始時發佈了dput。 – miababy

+1

您可以發佈列表中第一個條目的預期輸出嗎? – bouncyball

回答

0

,因爲我還沒有拿到50分的聲​​譽,我不能發表評論,如果你從一個要素移位的矢量和總是檢查載體和轉移載體的總和總是等於0?

你不會使用應用,但一段時間條件,它是不是真的一個好看的代碼,但它應該爲您的列表內的每個向量工作。

我創建這是剛剛從你的列表中的向量(由-1和1只)

x <- c(-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1) 

x1 <- x[-length(x)] 
x2 <- x[-1] 

y <- x1 + x2 

while (length(which((x1+x2)!=0))>0) { 
    x <- x[- which((x1+x2)!=0)[1]] 
    x1 <- x[-length(x)] 
    x2 <- x[-1] 
} 

現在,如果我打印x我確實刪除了所有的元素就是沒有形成一個向量x一對(-1,1)或(1,-1)與先前的元素。

x 
[1] -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 

我不確定這是你問的問題,但我希望它能幫助你至少一點。

+0

我試過這個,但它沒有給出準確的結果。你可以看到上面的代碼給出了(-1)和(1)。如果我把x改成'x < - c(-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1 ,1,1,-1,1,-1,-1,1,-1,1,-1,1)',那麼我的第一對記錄(-1 1),但我的第二對(1 -1)是沒有記錄。相反,它會刪除第三個元素「1」,然後再以-1開始。希望你明白我想說的是什麼 – miababy

+0

嘿!不是刪除額外的1或-1,而是可以將其更改爲零?這是我最初做什麼,但不小心刪除寫道:我 – miababy

+0

已經在這個問題上面添加一個期望的輸出 – miababy

0

我們可以定義一個函數,在向量x,並檢查「對」。如果該對不等於0,則用0替換該對中的第二項,然後繼續檢查矢量。我們使用ij作爲我們的迭代器。

good_pairs <- function(x){ 

    i <- 1 
    j <- 2 
    keepgoing <- TRUE 

    while(keepgoing){ 
     #grab a pair and sum it 
     pair <- x[c(i, j)] 
     pair_sum <- sum(pair) 

     while(pair_sum != 0){ #continue iterating until sum == 0 
      #replace i + 1 element with 0 
      x[j] <- 0 
      j <- j + 1 
      #break if we've run out of elements 
      if(is.na(x[j])){ 
       break 
      }else{ 
      #check the pair 
      pair <- x[c(i, j)] 
      pair_sum <- sum(pair) 
      } 

     } 
     #increment 
     i <- j + 1 
     j <- j + 2 
     keepgoing <- (length(x) > i) 

    } 
    x 
} 

lapply(trboot6, good_pairs) 
[[1]] 
[1] -1 1 -1 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

[[2]] 
[1] -1 0 0 1 1 0 -1 -1 0 0 0 0 1 1 -1 -1 0 0 0 1 1 0 -1 -1 0 0 0 0 0 0 0 0 0 1 1 -1 -1 0 0 0 0 0 0 0 
[45] 0 0 

[[3]] 
[1] 1 -1 -1 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 
[45] 0 0 0 0 

[[4]] 
[1] -1 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1 -1 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 1