R中的IFELSE返回不正确的值

ber*_*eri 2 if-statement r

我有一个包含手动输入的分类值的数据框,并且有几个错误。有人清理了坏数据,我将其加载到 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"))
Run Code Online (Sandbox Code Playgroud)

我想创建一个名为“Value_Final”的新列,其中包含 ID 1、2 和 3 的“讨论计划”。

我应该能够使用 ifelse 完成此操作,这似乎很简单:

test$Value_Final <- ifelse(is.na(test$Value_Clean), test$Value, test$Value_Clean)
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我得到以下信息:

> 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
Run Code Online (Sandbox Code Playgroud)

我勒个去?我觉得我在 R 中用 ifelse 做了类似的事情而没有遇到这个问题,那么发生了什么?

谢谢!

akr*_*run 5

这是一种factor强制转换为整数存储值的情况。可以stringsAsFactors = FALSE在创建时更正data.frame

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"
Run Code Online (Sandbox Code Playgroud)

或者,如果已经创建数据,然后可以转换到character与as.character

test[1:2] <- lapply(test[1:2], as.character)
Run Code Online (Sandbox Code Playgroud)

或者在 ifelse

ifelse(is.na(test$Value_Clean), as.character(test$Value), 
         as.character(test$Value_Clean))
Run Code Online (Sandbox Code Playgroud)