【问题标题】:R ifelse pumping out NAsR ifelse 抽出 NA
【发布时间】:2020-03-28 23:03:37
【问题描述】:

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

【问题讨论】:

  • 在您的函数中,您已将“y”预分配给单个值。
  • 即使我不这样做,也会发生同样的事情
  • i+1length(x) 是问题
  • 怎么样?我如何告诉 if/then 语句检查 i 值与它旁边的值?
  • for (i in length(x)) length of 'x' 只是一个值

标签: r for-loop if-statement


【解决方案1】:

如果我们需要计数序列,可以使用rleid from data.table

library(data.table)
rleid(x)

或与rle 来自base 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  

【讨论】:

  • 谢谢,但我正在尝试专门为此任务编写一个函数。这只是难倒我。
【解决方案2】:

也许这对你有用:

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指出之前的错误

【讨论】:

  • 为什么?它在 R 上运行,也许我错过了什么?
  • @akrun,请不要误会我的意思,我尊重你之前帮助过我的事实,所以我的问题是为什么会出错。请考虑一下我也在学习,一个错误可以让我在 R 中变得更好
  • 我的意思是你在ifelse. instead it can be y[j]里面做任务y[i] &lt;- 0
【解决方案3】:

我将再添加一个答案,因为所有之前的答案都错过了 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)

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2014-12-22
    • 2017-04-17
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多