[英]IFELSE in R returning incorrect values
我有一個包含手動輸入的分類值的數據框,並且有幾個錯誤。 有人清理了壞數據,我將其加載到 R 中並將其與我的其余數據合並。 到目前為止一切都很好。
例如,假設這是我在“值”列中的原始數據(好數據和壞數據的混合)和“Value_Clean”列中壞數據的更正數據。 顯然這是一個小例子,但我的實際數據框有幾十個不同值和幾千行的更正。
test <- data.frame(ID = c(1, 2, 3)
, Value = c("Discuss plan", "Discuss plan", "Discuss paln")
, Value_Clean = c(NA, NA, "Discuss plan"))
我想創建一個名為“Value_Final”的新列,其中包含 ID 1、2 和 3 的“討論計划”。
我應該能夠使用 ifelse 完成此操作,這似乎很簡單:
test$Value_Final <- ifelse(is.na(test$Value_Clean), test$Value, test$Value_Clean)
但是,當我這樣做時,我得到以下信息:
> test
ID Value Value_Clean Value_Final
1 1 Discuss plan <NA> 2
2 2 Discuss plan <NA> 2
3 3 Discuss paln Discuss plan 1
我勒個去? 我覺得我在 R 中用 ifelse 做了類似的事情而沒有遇到這個問題,那么發生了什么?
謝謝!
這是一個factor
強制轉換為整數存儲值的情況。 可以在創建data.frame
時使用stringsAsFactors = FALSE
進行更正
test <- data.frame(ID = c(1, 2, 3)
, Value = c("Discuss plan", "Discuss plan", "Discuss paln")
, Value_Clean = c(NA, NA, "Discuss plan"), stringsAsFactors = FALSE)
ifelse(is.na(test$Value_Clean), test$Value, test$Value_Clean)
#[1] "Discuss plan" "Discuss plan" "Discuss plan"
或者如果數據已經創建,那么可以使用as.character
轉換為character
test[1:2] <- lapply(test[1:2], as.character)
或者在ifelse
執行此ifelse
ifelse(is.na(test$Value_Clean), as.character(test$Value),
as.character(test$Value_Clean))
ifelse的dplyr版本沒有這個問題
ifelse(is.na(test$Value_Clean), test$Value, test$Value_Clean)
# [1] 2 2 1
dplyr::if_else(is.na(test$Value_Clean), test$Value, test$Value_Clean)
# [1] Discuss plan Discuss plan Discuss plan
# Levels: Discuss paln Discuss plan
僅供參考,對於此特定示例,您可以改用 coalesce
dplyr::coalesce(test$Value_Clean, test$Value)
# [1] Discuss plan Discuss plan Discuss plan
# Levels: Discuss plan
您可以嘗試 dplyr 和 tibbles 作為替代方案:
library(dplyr)
tibble(ID = c(1, 2, 3)
, Value = c("Discuss plan", "Discuss plan", "Discuss plan")
, Value_Clean = c(NA, NA, "Discuss plan")) %>%
mutate(Value_Final = ifelse(is.na(Value_Clean), Value, Value_Clean))
默認情況下,tibbles 不會將字符列轉換為因子,這在許多情況下都派上用場
編輯:使用as_tibble(dataframe)
將現有數據幀轉換為as_tibble(dataframe)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.