我想用一个有效的值替换因子列中的<NA>个值.但我找不到办法.此示例仅用于演示.原始数据来自一个我必须处理的 foreign csv文件.

df <- data.frame(a=sample(0:10, size=10, replace=TRUE),
                 b=sample(20:30, size=10, replace=TRUE))
df[df$a==0,'a'] <- NA
df$a <- as.factor(df$a)

可能看起来像这样

      a  b
1     1 29
2     2 23
3     3 23
4     3 22
5     4 28
6  <NA> 24
7     2 21
8     4 25
9  <NA> 29
10    3 24

现在我想用一个数字替换<NA>个值.

df[is.na(df$a), 'a'] <- 88
In `[<-.factor`(`*tmp*`, iseq, value = c(88, 88)) :
  invalid factor level, NA generated

我想我错过了一个关于因素的基本概念.是吗?

推荐答案

1) addNA如果fac是一个系数,则addNA(fac)是相同的系数,但添加NA作为一个水平.见?addNA

要强制NA水平为88:

facna <- addNA(fac)
levels(facna) <- c(levels(fac), 88)

给:

> facna
 [1] 1  2  3  3  4  88 2  4  88 3 
Levels: 1 2 3 4 88

1a)这可以写在一行中,如下所示:

`levels<-`(addNA(fac), c(levels(fac), 88))

2) factor也可以使用factor的各种参数在一行中完成,如下所示:

factor(fac, levels = levels(addNA(fac)), labels = c(levels(fac), 88), exclude = NULL)

2a)或同等标准:

factor(fac, levels = c(levels(fac), NA), labels = c(levels(fac), 88), exclude = NULL)

3) ifelse.另一种方法是:

factor(ifelse(is.na(fac), 88, paste(fac)), levels = c(levels(fac), 88))

4) forcats forcats软件包具有以下功能:

library(forcats)

fct_explicit_na(fac, "88")
## [1] 1  2  3  3  4  88 2  4  88 3 
## Levels: 1 2 3 4 88

Note:我们使用以下输入fac

fac <- structure(c(1L, 2L, 3L, 3L, 4L, NA, 2L, 4L, NA, 3L), .Label = c("1", 
"2", "3", "4"), class = "factor")

Update:人改进了(1)并增加了(1a).后来又增加了(4).

R相关问答推荐

从R中的函数中提取变量以及它们来自哪些环境?

self_函数无法工作--无法子集结束后的列

将一个载体的值相加,直到达到另一个载体的值

从R中的另一个包扩展S3类的正确方法是什么

如何写一个R函数来旋转最后n分钟?

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

错误:非常长的R行中出现意外符号

将数字转换为分钟和秒

如何使用tryCatch执行语句并忽略警告?

在使用tidyModels和XGBoost的二进制分类机器学习任务中,所有模型都失败

线性模型斜率在减少原始数据时提供NA

无法定义沿边轨迹的 colored颜色 渐变(与值无关)

条形图顶部与其错误条形图不对齐

R -在先前group_by级别汇总时获取最大大小子组的计数

防止正则表达式覆盖以前的语句

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

变异以按组从其他列创建具有最大和最小值的新列

如果满足条件,则替换列的前一个值和后续值

R-如何在ggplot2中显示具有不同x轴值(日期)的多行?

我已经运行了几个月的代码的`Palette()`中出现了新的gglot错误