首页 > 解决方案 > R ifelse 抽出 NA

问题描述

我正在尝试计算向量中相似连续数字的“块”。但是当我期望它输入“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 谢谢!

标签: rfor-loopif-statement

解决方案


如果我们需要一个计数序列,可以使用rleidfromdata.table

library(data.table)
rleid(x)

rlebase R

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

使用OP的代码,可以将'y'预先分配为length等于x长度的向量,然后循环'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  

推荐阅读