ifelse 赋值不 return 预定义字符向量

ifelse assignment does not return pre-defined character vector

我不明白为什么 ifelse 赋值没有 return 我试图传递的整个对象。

下面,我查看德克萨斯州是否在州名向量中(在我的实际代码中,我在 shapefile 中查找唯一的州名)。然后,如果 Texas 在此州名列表中,则将 Texas 和 New Mexico 的缩写分配给新对象 (states_abb)。否则,分配给 states_abb 加利福尼亚和内华达的缩写。

我从 ?ifelse 得知...

ifelse returns a value with the same shape as test which is filled with elements selected from either yes or no depending on whether the element of test is TRUE or FALSE.

所以在我下面的第一个例子中,我可以理解只有 CA 是 returned.

states <- c("California", "Nevada")
(states_abb <- ifelse("Texas" %in% states, c("NM", "TX"), c("CA", "NV")))
# [1] "CA"

但在下面的第二个示例中,我已经预定义了对象 canv_abb。为什么整个对象没有通过?即使它是一个字符向量,它也是它自己的对象,对吧?难道不应该通过整个“一揽子计划”吗?

txnm_abb <- c("NM", "TX")
canv_abb <- c("CA", "NV")
(states_abb <- ifelse("Texas" %in% states, txnm_abb, canv_abb))
# [1] "CA"

我很感激任何关于为什么会发生这种情况的见解。有人可以提供解决方案以便我可以指定两个缩写吗?

这里的关键词是'same length'。如果应用 ifelse 输入和输出必须具有相同的长度。在你的例子中是 1:2。在这种情况下,只会计算第一个。

参见?ifelse: 'ifelse returns 与 test 具有相同形状的值

解决方案使用经典的 if else 结构:

states <- c("California", "Nevada")

states_abb <- if ("Texas" %in% states) {
  c("NM", "TX")
} else {
  c("CA", "NV")
}
> states_abb
[1] "CA" "NV"

ifelse 是这里的错误工具。当您有一个 逻辑测试向量 并且您希望创建一个具有相同长度 的新向量 时,您可以使用 ifelse。您有一个 单个 逻辑测试,但希望您的输出是一个向量。

您所描述的内容最好由 ifelse 子句处理:

states_abb <- if("Texas" %in% states) txnm_abb else canv_abb

states_abb
#> [1] "CA" "NV"

要了解 ifelse 的工作原理,请考虑以下输入和输出:

condition <- c(TRUE, FALSE, FALSE)
input1    <- c("A", "b", "C")
input2    <- c("1", "2", "3")

result <- ifelse(condition, input1, input2)

result
#> [1] "A" "2" "3"

您会看到 ifelse 是一种矢量化的 shorthand 编写以下循环的方式,这是一种在数据整理中经常出现的模式:

result <- character(3)

for(i in 1:length(condition)) {
  result[i] <- if(condition[i]) input1[i] else input2[i]
}

result
#> [1] "A" "2" "3"

请注意,这不是您在自己的代码中尝试做的事情。