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

3
我有一个数据框 df,其中有多个列。 其中两列(AGE和SALARY)的类型为double。 我想用0替换AGE列中的缺失值, 用"not found"替换SALARY列中的缺失值。 最高效的方法是什么?
replace_na(df, list(AGE=0, SALARY="not found"))

我遇到了错误:
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(...)

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


1
请问您能否展示一下您的示例的dput。对于这个示例,代码是可以正常工作的,即 df <- data.frame(AGE = c(NA, 2, 3, 5, 7), SALARY = c(4, 3, NA, 7, 5)); replace_na(df, list(AGE=0, SALARY="not found")) - akrun
谢谢@akrun,使用您的df后我遇到了另一种类型的错误。不过我已经在帖子中添加了我的df链接。我不确定如何在stackoverflow上分享csv文件。抱歉。 - Mathica
可能是packageVersion('tidyr')的问题。我使用的是1.1.3 - akrun
1
抱歉,我无法通过您提供的数据重现您的问题。 - akrun
@Akrun,你一直很有帮助 :)。 - Mathica
显示剩余2条评论
2个回答

12

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

根据tidyr的更改日志:

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

您正在尝试转换两个列,“Age”和“Salary”。

仅转换“Age”本身应该可以工作,因为它很可能是双精度类型,并且您正在将NA转换为0,也是双精度类型。

mutate(Age = replace_na(Age, 0) #这应该可以工作

但是,当您尝试使用字符串“not found”替换'Salary'中的NA时,您必须将该列转换为字符型。以前,replace_na会自动执行此操作,但现在不再执行。您可以通过添加调用as.character来解决此问题。

mutate(Salary = replace_na(as.character(Salary), "not found") #新方法


0
根据链接的数据来看,您似乎有空白的数据单元格而不是NA。如果是这样的话,那么这个应该可以工作:
df %>%
  mutate(
    AGE = ifelse(AGE == "", 0, AGE),
    SALARY = ifelse(SALARY == "", "not found", SALARY)
  )
  AGE    SALARY
1   0         4
2   2         3
3   3 not found
4   5         7
5   7         5

数据:

df <- data.frame(AGE = c("", 2, 3, 5, 7), 
                 SALARY = c(4, 3, "", 7, 5))

这是我最初尝试的。但是我得到了以下错误信息:Error in UseMethod("mutate") : no applicable method for 'mutate' applied to an object of class "NULL" - Mathica
请发布您数据的片段,例如使用 dput(yourdata)。有了您的真实数据或其中的一小部分,我们肯定可以帮助您。 - Chris Ruehlemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接