簡體   English   中英

R中的IFELSE返回不正確的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM