簡體   English   中英

R ifelse 泵出 NA

[英]R ifelse pumping out NAs

我正在嘗試計算向量中類似連續數字的“塊”。 但是當我希望它輸入“1”或“0”時,我的代碼會吐出“NA”

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

turing <- function(x){
  y <- c(0)
  for (i in length(x)){
    ifelse(isTRUE(x[i] == x[i+1]), y[i]<-0, y[i]<-1)
  }
  y
}
turing(x)

這會吐出[1] 0 NA NA NA NA NA NA NA 1

編輯:以下似乎工作正常:

turing <- function(x){
  y <-  numeric(length(x))
  for (i in seq_along(x)){
    ifelse(isTRUE(x[i] == x[i+1]), y[i] <-0 , y[i] <- 1)
  }
  y
}

當它吐出時0 1 1 0 0 1 0 1 1謝謝!

如果我們需要一個計數序列,可以使用rleiddata.table

library(data.table)
rleid(x)

或使用來自base R rle

with(rle(x), rep(seq_along(values), lengths))

使用 OP 的代碼,可以將 'y' 預先分配為length等於 x length的向量,然后循環遍歷 'x' 的序列(而不是 'length',因為長度只是一個數字),然后執行if/elseifelse是矢量化選項,因為我們在循環中這樣做, if/else只需要)

turing <- function(x){
    y <-  numeric(length(x))
    for (i in seq_along(x)){
    if(i < length(x)) {
      if(x[i] == x[i+1]) {
        y[i]<-0
        } else y[i]<-1
    }}
    y[length(y)] <- 1

    y
  }

turing(x)
#[1] 0 1 1 0 0 1 0 1 1  

也許這對你有用:

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

turing <- function(x){
  j<- 1
  for (i in x){
    y[j] <- ifelse((x[j] == x[j+1]), 0, 1)
    j <- j+1
  }
  y
}
turing(x)

感謝您指出之前的錯誤@akrun

我將再添加一個答案,因為之前的所有答案都錯過了ifelse函數的一個很酷的事情是我在整個向量上工作,因此您不需要任何 for 循環和索引

turing <- function(x){
  ifelse(x[1:length(x)-1] == x[2:length(x)], 0,1)
}
turing(x)

您還可以使用 dplyr 包中的函數lead讓它更干凈一些

ifelse(x == dplyr::lead(x), 0,1)

希望這可以幫助!!

暫無
暫無

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

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