将数值列的 NA 替换为 R 中的数值和字符值

Mat*_*ica 3 r missing-data dataframe na

我有一个包含多列的数据框 df 。
其中两列( AGE 和 SALARY 列)的类型为 double 。
我想用 0 替换 AGE 列的缺失值,
用“未找到”替换 SALARY 列的缺失值。

最有效的方法是什么?

replace_na(df, list(AGE=0, SALARY="not found"))
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Error in `stop_vctrs()`:
! Can't convert `replace$SALARY` <character> to match type of `data$SALARY` <double>.
Backtrace:
 1. tidyr::replace_na(df, list(AGE= 0, SALARY= "not found"))
 2. tidyr:::replace_na.data.frame(df, list(AGE= 0, SALARY= "not found"))
 3. vctrs::vec_assign(...)
 4. vctrs `<fn>`()
 5. vctrs::vec_default_cast(...)
 6. vctrs::stop_incompatible_cast(...)
 7. vctrs::stop_incompatible_type(...)
 8. vctrs:::stop_incompatible(...)
 9. vctrs:::stop_vctrs(...)
Run Code Online (Sandbox Code Playgroud)

编辑:这是我的数据集的来源:https://drive.google.com/file/d/1cKxzNrnIMq4RxdMcBz3nlr7YtYaPhn5_/view ?usp=sharing

Jam*_*mes 12

将 tidyr 更新到版本 1.2.0 后我遇到了同样的问题

来自 tidyr 的变更日志:

在应用替换时,replace_na() 不再允许更改数据类型。现在,replace 将始终转换为进行替换之前的数据类型。例如,这意味着不再允许在整数列上使用替换值 1.5。类似地,替换列表列中的缺失值现在必须使用 list("foo") 而不仅仅是 "foo" 来完成。

您正在尝试转换两列“年龄”和“薪水”。

单独转换“Age”应该可以,因为它可能是 double 类型,并且您将 NA 转换为 0,也是 double 类型。

mutate(Age = replace_na(Age, 0) #This should work

但是,当您尝试replace_na在“薪水”中使用字符串“未找到”时,您必须将该列转换为字符replace_na过去会自动执行此操作,但现在不再这样做了。您可以通过添加对as.character 的调用来解决此问题

mutate(Salary = replace_na(Salary, "not found") #used to work

新方法:

mutate(Salary = replace_na(as.character(Salary), "not found") #New method