当我尝试使用ifelse而不是if ... else ...在R中改造代码时,为什么我得到了不同的答案

时间:2016-05-19 16:34:45

标签: r

我尝试将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之间的确切区别是什么?非常感谢。

1 个答案:

答案 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的逻辑。