首页 > 解决方案 > 将 Col2:ncol(df) 转换为百分比格式

问题描述

我有一个数据框,每个月都会出现一个新的列。如何将 Col2 中的所有列转换为数据框中的列数为没有小数点的百分比格式?

我想我应该做这样的事情:

df

Col1    Col2   Col3
   A     0.3    0.4
   B     0.3    0.5
   C     0.3    0.1

df[,2:ncol(df)] <- label_percent(accuracy = 1L)(df[,2:ncol(df)])

但这不起作用。

更新:在 databricks 中,我想从 display() 函数中排序,但它不允许我,因为它正在读取 label_percent() 作为字符值 在此处输入图像描述

标签: r

解决方案


一个选项是lapply循环列,应用label_percent并将其分配回数据集列。如果我们想在应用之前对列进行排序,label_percent因为输出列是character

library(scales)
dfnew <- df[do.call(order, df[-1]),]
dfnew[-1] <- lapply(dfnew[-1], function(x) label_percent(accuracy = 1)(x))

或者如果我们想pad在开头为 0

library(stringr)
df[-1] <- lapply(df[-1], function(x)
       str_pad(label_percent(accuracy = 1)(x), width = 3, pad = '0'))

或使用dplyr

library(dplyr)
library(scales)
df1 <- dfnew %>%
    mutate(across(-1, ~ label_percent(accuracy = 1)(.)))

或使用percent来自formattable

library(formattable)
df1 <- df %>%
        mutate(across(-1, ~ percent(.)))


df1
#  Col1   Col2   Col3
#1    A 30.00% 40.00%
#2    B 30.00% 50.00%
#3    C 30.00% 10.00%

检查sorting

df1 %>% 
   arrange(Col3)
#  Col1   Col2   Col3
#1    C 30.00% 10.00%
#2    A 30.00% 40.00%
#3    B 30.00% 50.00%


df1 %>% 
    arrange(desc(Col3))
#  Col1   Col2   Col3
#1    B 30.00% 50.00%
#2    A 30.00% 40.00%
#3    C 30.00% 10.00%

数据

df <- structure(list(Col1 = c("A", "B", "C"), Col2 = c(0.3, 0.3, 0.3
), Col3 = c(0.4, 0.5, 0.1)), class = "data.frame", row.names = c(NA, 
-3L))

推荐阅读