[英]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
謝謝!
如果我們需要一個計數序列,可以使用rleid
的data.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/else
( ifelse
是矢量化選項,因為我們在循環中這樣做, 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.