2016-11-08 69 views
3

我有一個數據框,其中包含一個字符變量,主要包括數值,偶爾有已知字符串以及一些NA值。我想有條件地將數值重新格式化爲有一個小數位,但是隻保留字符和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> 

但將引發警告消息

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條件爲false的情況。

我可以將整個東西包裝在suppressWarnings()中,但有沒有其他方法可以在dplyr框架內生成所需的輸出而不會出現警告?我敢肯定有一個data.table方式做到這一點,但是這是不需要data.table爲別的包的一部分,它似乎愚蠢,使之必要這樣一小片......

回答

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>