首页 文章

dplyr条件变异本身

提问于
浏览
3

我有一个数据框,其中的字符变量主要由数值组成,偶尔会有已知的字符串以及一些 NA 值 . 我想有条件地重新格式化数值以具有一个小数位,但保留字符和 NA 值 .

此代码适用于玩具数据框并生成所需的输出:

df <- data.frame(a = c("1", "2", "3", "none", NA),
                 stringsAsFactors = FALSE)

test <- df %>%
  mutate(a = ifelse(is.na(a) | a == "none",
                    a,
                    format(round(as.numeric(a), 1), nsmall = 1)))

test
#    a
# 1  1.0
# 2  2.0
# 3  3.0
# 4 none
# 5 <NA>

但是会发出警告信息

Warning message:
In format(round(as.numeric(c("1", "2", "3", "none", NA)), 1), nsmall = 1) :
  NAs introduced by coercion

我相信是这样的情况b / c format(round(as.numeric(a), 1), nsmall = 1))) 仍然作用于整个向量,即使其中的值仅用于 mutate 条件为 mutate 的语句中 .

我可以将整个事情包装在 suppressWarnings() 中,但是还有其他方法可以在 dplyr 框架内生成所需的输出而不发出警告吗?我是'm sure there'这样做的方法,但这是一个包的一部分,不需要 data.table 用于其他任何东西,这对于这样一个小块来说它是必要的似乎很愚蠢......

1 回答

  • 6

    使用 replace 并且您只能转换 a 列中的数字类型数据:

    test <- df %>%
        mutate(a = replace(a, !is.na(a) & a != "none",
                           format(round(as.numeric(a[!is.na(a) & a != "none"]), 1), nsmall = 1)))
    
    test
    #     a
    #1  1.0
    #2  2.0
    #3  3.0
    #4 none
    #5 <NA>
    

相关问题