dplyr条件变异本身

时间:2016-11-08 18:11:54

标签: r dplyr

我有一个数据框,其中的字符变量主要由数值组成,偶尔会有已知的字符串以及一些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语句中的ifelse条件是假的。

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

1 个答案:

答案 0 :(得分: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>