r - 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
谢谢!
解决方案
如果我们需要一个计数序列,可以使用rleid
fromdata.table
library(data.table)
rleid(x)
或rle
从base R
with(rle(x), rep(seq_along(values), lengths))
使用OP的代码,可以将'y'预先分配为length
等于x长度的向量,然后循环'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
推荐阅读
- javascript - 在构建电子时如何提供自己的版本
- mysql - 是否可以使用 . 在名称中使用 ansible 模块?如何?
- c++ - 为什么`std::conj(double d)`不返回`double`而是`std::complex
`? - python - TypeError:“linehistory”对象不是迭代器
- node.js - 可以通过浏览器控制台访问firebase来创建用户吗?
- python - 如何从 AWS 胶水中的 Odata url 读取数据并写入 AWS 中的 S3 存储桶
- r - 在堆叠的 geom_col 图上叠加密度曲线?[包括代码和图像]
- python-3.x - TwitchIO:删除频道中的单个消息
- python - 在一个字段中保存多个值(Django)
- spring-boot - Spring Boot 应用程序中的空自动装配对象