r - '需要 TRUE/FALSE 的缺失值'
问题描述
我收到了错误
Error in if (x[i] == 0 && x[i - 1] > 0) { :
missing value where TRUE/FALSE needed
在数值向量上运行此函数时
number_rn <- function(x) {
a <- 0
for (i in 1:length(x)) {
if (x[i] == 0 && x[i-1] > 0) {
a <- a +1
}
}
print(a)
}
但是,以下功能可以正常工作:
number_rr <- function(x) {
a <- 0
for (i in 1:length(x)) {
if (x[i] > 0 && x[i-1] > 0) {
a <- a +1
}
}
print(a)
}
我从以前对类似问题的回答中注意到,如果if
条件没有 aTRUE
或FALSE
结果,则可能会发生这种情况,但我认为在我的示例中并非如此。什么可能导致此错误?
解决方案
for 循环有几个问题(即使x
不包含任何NA
值):
- 在第一次迭代 (
i == 1
) 中,x[i-1]
指的x[0]
是未定义的,因为 R 中的索引从 开始1
。 - 该代码使用 for 循环,其中可以使用矢量化函数。
不幸的是,在 处开始循环i == 2
,即,for (i in 2:length(x))
在单元素向量 where 的情况下不是防错的length(x) == 1
。
我的建议是使用矢量化版本
number_rn_vec <- function(x) {
n <- length(x)
sum(x[2:n] == 0 & x[1:(n - 1)] > 0, na.rm = TRUE)
}
对于许多用例,这将返回a
而不会出错:
sapply(
list(
c(),
c(1),
c(1, 0),
c(1, 0, 3),
c(0, 1, 0, 3),
c(NA, 1, 0, 3),
c(1, NA, 0, 3),
c(1, 0, NA, 3),
c(1, 0, 3, NA)
),
number_rn_vec
)
[1] 0 0 1 1 1 1 0 1 1
推荐阅读
- c# - 我们如何在 C# 中为 Azure Data Lake 在 azure fileclient 中设置 setMetadata
- python-3.x - 如果找到特定字符串,则设置为变量
- algorithm - 是否重新排列 Floyd-Warshall 算法中的外循环,因为大多数内循环会改变算法
- amazon-web-services - AWS 未能为放大应用程序创建后端
- r - 在 RSelenium 中截取屏幕截图
- reactjs - 反应改变状态下一个组件
- agora.io - Agora.io 用户无法显示其他用户,但可以发送自己的图像并显示
- api - 邮递员多次运行相同的请求
- microsoft-graph-api - 在 Teams 中跟踪用户位置
- python - matplotlib 中的工具栏在 tkinter 画布中不起作用