【问题标题】:Why is mutate(across)) converting a factor to an integer?为什么 mutate(across)) 将因子转换为整数?
【发布时间】:2022-11-12 05:34:25
【问题描述】:

我有一个数据集,其中包含我想更改为 NA 的 NaN 值。我想出了以下解决方案。但是,一个意想不到的副作用是它将作为因子的列更改为整数。为什么会这样?我该如何预防?

library(dplyr)

x <- data.frame(x1 = factor(c("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
                              "b", "b", "b", "b", "b", "b", "b", "b", "b", "b")),
                x2 = c(seq(1,20,1)),
                x3 = c(seq(21,40,1)))

x[12,1] <- NA
x[16,2] <- NA
x[3,3] <- NA

str(x)
'data.frame':   20 obs. of  3 variables:
 $ x1: Factor w/ 2 levels "a","b": 1 1 1 1 1 1 1 1 1 1 ...
 $ x2: num  1 2 3 4 5 6 7 8 9 10 ...
 $ x3: num  21 22 NaN 24 25 26 27 28 29 30 ...


x <- x %>%
  mutate(across(.cols = everything(), ~ifelse(is.nan(.), NA, .)))

str(x)
'data.frame':   20 obs. of  3 variables:
 $ x1: int  1 1 1 1 1 1 1 1 1 1 ...
 $ x2: num  1 2 3 4 5 6 7 8 9 10 ...
 $ x3: num  21 22 NA 24 25 26 27 28 29 30 ...

【问题讨论】:

    标签: r dplyr integer


    【解决方案1】:

    如果您正在搜索 NaN 值。 (而不仅仅是 NA 值),只查看数字列可能是有意义的。而且if_else 有时需要使用 NA 值的“类型化”版本,以便它可以正确地将所有值组合成正确的向量类型。这应该工作

    x %>% 
      mutate(across(.cols = where(is.numeric), ~if_else(is.nan(.), NA_real_, .)))
    

    【讨论】:

    • 啊当然。 Nan 只能在数字列中。完全有道理!
    猜你喜欢
    • 2022-08-23
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多