有人可以告诉我这个在R中的if-else循环有什么问题吗?我经常无法使if-else循环工作。我收到一个错误:
if(match('SubjResponse',names(data))==NA) {
observed <- data$SubjResponse1
}
else {
observed <- data$SubjResponse
}
请注意,data
是一个数据框。
错误是
Error in if (match("SubjResponse", names(data)) == NA) { :
missing value where TRUE/FALSE needed
答案 0 :(得分:7)
这不是一个完整的例子,因为我们没有数据,但我看到了这些问题:
NA
进行测试,您需要==
is.na()
和朋友的输出通常会测试为NULL或match()
length()==0
。答案 1 :(得分:2)
正如@DirkEddelbuettel所指出的那样,你无法以这种方式测试NA
。但是,您可以match
不返回NA
:
通过使用nomatch=0
并反转if
子句(因为0
被视为FALSE
),代码可以简化。此外,另一个有用的编码习惯是分配if子句的结果,这样你就不会在其中一个分支中输错变量名...
所以我会这样写:
observed <- if(match('SubjResponse',names(data), nomatch=0)) {
data$SubjResponse # match found
} else {
data$SubjResponse1 # no match found
}
顺便说一句,如果你“经常”遇到if-else问题,你应该知道两件事:
要测试的对象不得包含NA或NaN,或者是字符串(模式字符)或其他无法强制转换为逻辑值的类型。数字正常:0为FALSE
其他任何内容(但NA / NaN)为TRUE
。
对象的长度应该是1(标量值)。 可以更长,但随后会收到警告。如果它更短,则会出错。
示例:
len3 <- 1:3
if(len3) 'foo' # WARNING: the condition has length > 1 and only the first element will be used
len0 <- numeric(0)
if(len0) 'foo' # ERROR: argument is of length zero
badVec1 <- NA
if(badVec1) 'foo' # ERROR: missing value where TRUE/FALSE needed
badVec2 <- 'Hello'
if(badVec2) 'foo' # ERROR: argument is not interpretable as logical