我無法弄清楚為什么ifelse分配不回傳我試圖傳遞的整個物件。
下面,我查看德克薩斯州是否在州名向量中(在我的實際代碼中,我在 shapefile 中查找唯一的州名)。然后,如果德克薩斯州在此州名串列中,則將德克薩斯州和新墨西哥州的縮寫分配給新物件 (states_abb)。否則,將 California 和 Nevada 的縮寫分配給 states_abb。
我從這篇文章中知道?ifelse...
ifelse 回傳一個與 test 具有相同形狀的值,該值填充有從 yes 或 no 中選擇的元素,具體取決于 test 的元素是 TRUE 還是 FALSE。
因此,在下面的第一個示例中,我可以理解只回傳 CA。
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"
我感謝任何關于為什么會發生這種情況的見解。有人可以提供一個解決方案,以便我可以分配兩個縮寫嗎?
uj5u.com熱心網友回復:
ifelse是這里的錯誤工具。當您ifelse有一個邏輯測驗向量并且您希望創建一個相同長度的新向量時使用。您有一個邏輯測驗,但希望您的輸出是一個向量。
您所描述的最好由ifandelse子句處理:
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是撰寫以下回圈的矢量化簡寫方式,這是一種在資料爭吵中經常出現的模式:
result <- character(3)
for(i in 1:length(condition)) {
result[i] <- if(condition[i]) input1[i] else input2[i]
}
result
#> [1] "A" "2" "3"
請注意,這不是您在自己的代碼中嘗試執行的操作。
uj5u.com熱心網友回復:
這里的關鍵詞是“相同長度”。如果您ifelse同時應用輸入和輸出必須具有相同的長度。在您的情況下,它是 1:2。在這種情況下,只會計算第一個。
請參閱?ifelse:'ifelse回傳一個與 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"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/463109.html
