R Применение собственной функции форматирования к фрейму данных R - PullRequest
0 голосов
/ 27 февраля 2019

Я использую 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 голосов
/ 27 февраля 2019

Используйте 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
0 голосов
/ 27 февраля 2019

В этом случае mapply подходит вам лучше:

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

Вам даже не нужна оболочка format44.Вы можете использовать:

df$c <- mapply(format, df$a, 4,4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...