2016-11-08 11 views
3

私は、大抵は数値で構成され、時折既知の文字列といくつかのNA値からなる文字変数を持つデータフレームを持っています。条件付きで小数点以下1桁に数値を再フォーマットしたいが、文字とNAの値だけを残しておきたい。dplyr条件付き突然変異自体

このコードは、おもちゃのデータフレーム上で動作し、所望の出力生成:

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> 

をしかし、私はB/C format(round(as.numeric(a), 1), nsmall = 1)))がまだ動作している場合であると信じて、警告メッセージ

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

をスローしますそのベクトルの値はifelseの条件がfalseのmutateステートメントでのみ使用されますが、ベクトル全体に適用されます。

suppressWarnings()にすべてをラップすることができますが、dplyrフレームワーク内で警告なしで目的の出力を生成する方法がありますか?私はそれを行うにはdata.table方法があります確信しているが、これは何かのためにdata.tableを必要としないパッケージの一部であり、...このような小さな作品のためにそれが必要な作るために愚かなようだ

答えて

6

使用replaceaの数値型データのみを変換することができます。

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> 
関連する問題