我尝试将data.frame中的某些列从整数转换为数字。这段代码效果很好。
test.data[] <- lapply(test.data, function(x) if(is.integer(x)) as.numeric(x) else x)
但是当我使用ifelse而不是if ... else ....结果是胡说八道。
test.data[] <- lapply(test.data, function(x) ifelse(is.integer(x), as.numeric(x), x))
为什么以及if ... else和ifelse之间的确切区别是什么?非常感谢。
答案 0 :(得分:0)
ifelse
返回的结果与所有情况下的第一个参数的长度相同。因此,它将在您的示例中返回x
的第一个元素。 if-else根据单个逻辑值(长度为1的向量,或长向量的第一个元素,带有警告)返回两个值中的一个。
> x <- c(1L, 2L, 3L)
> ifelse(is.integer(x), as.numeric(x), x)
[1] 1
> y <- c(1,2,3)
> ifelse(is.integer(y), as.numeric(y), y)
[1] 1
> if (TRUE) {1:10} else {11:20}
[1] 1 2 3 4 5 6 7 8 9 10
> if (FALSE) {1:10} else {11:20}
[1] 11 12 13 14 15 16 17 18 19 20
在您的情况下,if-else是正确的操作,因为is.integer
适用于向量并返回长度为1的逻辑。