将 class 因子列中的 NA 转换为 0
convert NA in a column of class factor to 0
我有一列类型因素。列中的某些值是 NA 值。
如何将所有这些 NA 值转换为新级别,比如 0 或 "OriginallyNA" 或其他值。
我能够将 class 数字列的 NA 转换为 0,但无法将 class 因子列转换为 0。
我的数据
> col1 = c(1,2,3,4,NA)
> col2 = c(6,7,NA,NA,8)
> df = data.frame(col1,col2)
> df
col1 col2
1 1 6
2 2 7
3 3 NA
4 4 NA
5 NA 8
> df$col2 = as.factor(df$col2)
> class(df$col1)
[1] "numeric"
> class(df$col2)
[1] "factor"
尝试将 NA 值转换为另一个级别,比如 0
> df[is.na(df)] = 0
Warning message:
In `[<-.factor`(`*tmp*`, thisvar, value = 0) :
invalid factor level, NA generated
> df
col1 col2
1 1 6
2 2 7
3 3 <NA>
4 4 <NA>
5 0 8
> levels(df$col2)
[1] "6" "7" "8"
是不是要把factor列转成numeric,把NA值改成0,转完再转回factor,如下。有没有更好的方法?
> df$col2 = as.numeric(df$col2)
> df
col1 col2
1 1 1
2 2 2
3 3 NA
4 4 NA
5 0 3
> df[is.na(df)] = 0
> df
col1 col2
1 1 1
2 2 2
3 3 0
4 4 0
5 0 3
> df$col2 = as.factor(df$col2)
> df
col1 col2
1 1 1
2 2 2
3 3 0
4 4 0
5 0 3
警告:
Warning message:
In `[<-.factor`(`*tmp*`, thisvar, value = 0) :
invalid factor level, NA generated
表示您尝试分配一个因子列,其值在其水平中不存在。您应该先添加缺失级别,然后再分配它,就像您尝试使用 df[is.na(df)] <- 0
所做的那样。
这里有一个辅助函数,您可以对 data.frame 中的任何因子列执行此操作:
re_levels <-
function(col) {
if (is.factor(col)) levels(col) <- c(levels(col), "0")
col
}
然后你将它应用到你的 data.frame 并将缺失的级别更改为 0 :
df <- sapply(df,re_levels)
df[is.na(df)] <- 0
# col1 col2
# [1,] 1 1
# [2,] 2 2
# [3,] 3 0
# [4,] 4 0
# [5,] 0 3
如果你使用
df$col2 <- addNA(df$col2)
您将获得一个新的等级'NA'。
我有一列类型因素。列中的某些值是 NA 值。 如何将所有这些 NA 值转换为新级别,比如 0 或 "OriginallyNA" 或其他值。
我能够将 class 数字列的 NA 转换为 0,但无法将 class 因子列转换为 0。
我的数据
> col1 = c(1,2,3,4,NA)
> col2 = c(6,7,NA,NA,8)
> df = data.frame(col1,col2)
> df
col1 col2
1 1 6
2 2 7
3 3 NA
4 4 NA
5 NA 8
> df$col2 = as.factor(df$col2)
> class(df$col1)
[1] "numeric"
> class(df$col2)
[1] "factor"
尝试将 NA 值转换为另一个级别,比如 0
> df[is.na(df)] = 0
Warning message:
In `[<-.factor`(`*tmp*`, thisvar, value = 0) :
invalid factor level, NA generated
> df
col1 col2
1 1 6
2 2 7
3 3 <NA>
4 4 <NA>
5 0 8
> levels(df$col2)
[1] "6" "7" "8"
是不是要把factor列转成numeric,把NA值改成0,转完再转回factor,如下。有没有更好的方法?
> df$col2 = as.numeric(df$col2)
> df
col1 col2
1 1 1
2 2 2
3 3 NA
4 4 NA
5 0 3
> df[is.na(df)] = 0
> df
col1 col2
1 1 1
2 2 2
3 3 0
4 4 0
5 0 3
> df$col2 = as.factor(df$col2)
> df
col1 col2
1 1 1
2 2 2
3 3 0
4 4 0
5 0 3
警告:
Warning message:
In `[<-.factor`(`*tmp*`, thisvar, value = 0) :
invalid factor level, NA generated
表示您尝试分配一个因子列,其值在其水平中不存在。您应该先添加缺失级别,然后再分配它,就像您尝试使用 df[is.na(df)] <- 0
所做的那样。
这里有一个辅助函数,您可以对 data.frame 中的任何因子列执行此操作:
re_levels <-
function(col) {
if (is.factor(col)) levels(col) <- c(levels(col), "0")
col
}
然后你将它应用到你的 data.frame 并将缺失的级别更改为 0 :
df <- sapply(df,re_levels)
df[is.na(df)] <- 0
# col1 col2
# [1,] 1 1
# [2,] 2 2
# [3,] 3 0
# [4,] 4 0
# [5,] 0 3
如果你使用
df$col2 <- addNA(df$col2)
您将获得一个新的等级'NA'。