我有这个示例数据框
df <- data.frame(status=c('single', 'married', 'married', "fff"),
education=c(3456, 898989899, 23939004, NA),
income=c('34.5%', '88.456%', '92', NA))
df
我执行以下代码,仅在字符列中用逗号替换小数点
df1<-df %>% mutate(across(where(is.character), ~ str_replace_all(., "\\.", ",")))
输出df1正常。 接下来,我只想将点仅添加到数字列的值上。例如我想要 3.456、898.989.899 等
但我很难做到这一点。我试过了
df2<- df1 %>% mutate(across(where(is.numeric) , ~ prettyNum(., big.mark=".") ))
虽然它似乎有效,但我收到一条警告消息。
Warning message:
There were 5 warnings in `mutate()`.
The first warning was:
ℹ In argument: `across(where(is.numeric), ~prettyNum(., big.mark = "."))`.
Caused by warning in `prettyNum()`:
! 'big.mark' and 'decimal.mark' are both '.', which could be confusing
ℹ Run `dplyr::last_dplyr_warnings()` to see the 4 remaining warnings.
此外,在 df2 中,我不再有数字列,如
str(df2)
所示。全部
columns 是字符列,这是我不想要的,因为 NA 变成“NA”,所以在 Excel 中,我将拥有“NA”字符串,而不是空白单元格。我想维护相应列的数字类别。
有没有办法避免这些并发症?
请注意,我的真实数据集包含数百个此类数字和字符列以及数千行,因此更通用的代码会有所帮助。
警告消息只是强调使用小数分隔符代替逗号是有问题的,并且可能会导致数据输入或计算出现问题。您可以使用
options(warn=-1)
来消除此警告
教育列被转换为字符串,因为数字列仅支持数字数据类型(例如整数或小数)。具有多个小数点的值不适合数字数据类型,因此与数字表示不兼容。
您可以使用 dplyr::na_if() 从字符串转换 NA 值
df3 <- df2 %>% mutate(across(everything(), ~dplyr::na_if(., "NA")))
str(df3)
print(is.na(df3))