R在数据帧R上应用自制的格式化功能

时间:2019-02-27 17:36:23

标签: 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

有什么问题吗?

2 个答案:

答案 0 :(得分:2)

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

10

给予:

sprintf

或用dplyr编写此代码:

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

答案 1 :(得分:1)

在这种情况下,mapply更适合您:

df$b <- mapply(format44, df$a)

您甚至不需要format44包装器。您可以使用:

df$c <- mapply(format, df$a, 4,4)