数据框中的 prettyNum 函数,具有数字和字符列

问题描述 投票:0回答:1

我有这个示例数据框

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”字符串,而不是空白单元格。我想维护相应列的数字类别。

有没有办法避免这些并发症?

请注意,我的真实数据集包含数百个此类数字和字符列以及数千行,因此更通用的代码会有所帮助。

r database
1个回答
0
投票

警告消息只是强调使用小数分隔符代替逗号是有问题的,并且可能会导致数据输入或计算出现问题。您可以使用

options(warn=-1)

来消除此警告

教育列被转换为字符串,因为数字列仅支持数字数据类型(例如整数或小数)。具有多个小数点的值不适合数字数据类型,因此与数字表示不兼容。

您可以使用 dplyr::na_if() 从字符串转换 NA 值

df3 <- df2 %>% mutate(across(everything(), ~dplyr::na_if(., "NA")))
str(df3)
print(is.na(df3))
© www.soinside.com 2019 - 2024. All rights reserved.