我有一个包含手动输入的分类值的数据框,并且有几个错误。有人清理了坏数据,我将其加载到 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 做了类似的事情而没有遇到这个问题,那么发生了什么?
谢谢!
这是一种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)