首页 > 解决方案 > R在数据框R上应用自制格式化功能

问题描述

我正在使用 R,我需要在数据帧中格式化数字,特别是通过在小数点分隔符之前和之后强加位数。例如3.56必须成为"0003,56000".

所以我建立了自己的功能:

format <- function(x, nbr_before_comma, nbr_after_comma){

  x= round(x, nbr_after_comma)
  x = toString(x)
  l = strsplit(x, "[.]")[[1]]

  #print(l)

  #print(nchar(l[2]))

  before_comma = paste0(strrep("0",nbr_before_comma - nchar(l[1])),l[1])
  after_comma = ifelse(length(l) > 1,
                         paste0(l[2],strrep("0",nbr_after_comma - nchar(l[2]))),
                         strrep("0", nbre_after_comma))

  res = paste0(before_comma, ",", after_comma)

  return(res)

}

在单个号码上尝试此操作将起作用。现在我正在尝试将其应用于数据框。让我们以玩具为例:

df <- data.frame("a" = c(2.5,3.56,4.5))

我更精确地定义了我想要的:

format44 <- function(x){

  return(format(x,4,4))

}

我尝试了几种可能性:

df[] <- lapply(df, format44)

dplyr

df <- df %>% 
  mutate(a = format44(a))

最后:

df["a"] <- lapply(df["a"],format44)

没有一个会起作用。实际上,我每次都得到相同的输出:

          a
1 0002,5, 3
2 0002,5, 3
3 0002,5, 3

知道问题是什么吗?

标签: r

解决方案


使用sprintf然后将小数点转换为逗号:

before <- after <- 4
fmt <- sprintf("%%0%d.%df", before + after + 1, after)
transform(df, a = chartr(".", ",", sprintf(fmt, a)))

给予:

          a
1 0002,5000
2 0003,5600
3 0004,5000

或者用 dplyr 写这个:

library(dplyr)

before <- after <- 4
df %>%
  mutate(a = "%%0%d.%df" %>%
             sprintf(before + after + 1, after) %>% 
             sprintf(a) %>%
             chartr(".", ",", .))

给予:

          a
1 0002,5000
2 0003,5600
3 0004,5000

推荐阅读