Как форматировать данные по строкам в R

Я знаю, как форматировать значения по столбцам в datatable, но я не могу найти хороший способ отформатировать их по строкам.

Для простоты я использую mtcars в качестве примера. Следующий код будет форматировать первый и третий столбцы в процентах. Но как я могу установить первую и третью строки в процентах?

datatable(mtcars[1:5,]) %>% formatPercentage(c(1,3), digits = 2)

Всего 1 ответ


Предположения:

  • это R-решение, не относящееся к DT ... возможно, в DT есть трюк, чтобы сделать это внутри, вместо того, чтобы собирать данные
  • вы не используете числовые функции сортировки или похожие номера в DT ; если вы их используете, то сортировка по номерам будет неправильной (например, "88" предшествует "9" )
  • Комментарий @ djhurio не совсем применим к вам (потому что, если это так, сделайте это)

Продолжая использование mtcars .

mt <- mtcars[3:8,1:5]
str(mt)
# 'data.frame': 6 obs. of  5 variables:
#  $ mpg : num  22.8 21.4 18.7 18.1 14.3 24.4
#  $ cyl : num  4 6 8 6 8 4
#  $ disp: num  108 258 360 225 360 ...
#  $ hp  : num  93 110 175 105 245 62
#  $ drat: num  3.85 3.08 3.15 2.76 3.21 3.69

Поскольку вы хотите поместить знаки процента на все столбцы в пределах одной или нескольких строк, тогда все в ваших данных будет строками. В R (и некоторых других языках тоже), нет никакого способа обойти это.

Я собираюсь систематически проходить каждый «класс» столбца, чтобы продемонстрировать, что вы можете обрабатывать целые числа отдельно от плавающей запятой и т. Д. Используйте все или ничего. Кроме того, для процентов здесь я просто добавляю знак процента; вам, вероятно, придется умножить на 100, тоже.

mt[c(2,4)] <- lapply(mt[c(2,4)], paste0, "%")
isint <- sapply(mt, is.integer)
mt[isint] <- lapply(mt[isint], format, format="%d")
isnum <- sapply(mt, is.numeric)
mt[isnum] <- lapply(mt[isnum], format, format="%0.3f")
islgl <- sapply(mt, is.logical)
mt[islgl] <- lapply(mt[islgl], as.character)
mt
#                    mpg cyl  disp   hp drat
# Datsun 710        22.8  4% 108.0  93% 3.85
# Hornet 4 Drive    21.4  6% 258.0 110% 3.08
# Hornet Sportabout 18.7  8% 360.0 175% 3.15
# Valiant           18.1  6% 225.0 105% 2.76
# Duster 360        14.3  8% 360.0 245% 3.21
# Merc 240D         24.4  4% 146.7  62% 3.69

Теперь для «этих двух строк». Это действительно может применяться к любому количеству строк, просто обновите мою магическую переменную i в lapply . Сначала я создаю вектор столбцов, у которых уже нет знака процента, так как в противном случае вы будете их двойным процентом:

needspct <- sapply(mt, function(a) all(!grepl("%", a)))

а потом

mt[needspct] <- lapply(mt[needspct], function(d,i) { d[i] <- paste0(d[i], "%"); d; },
                       i=c(3,6))
mt
#                     mpg cyl   disp   hp  drat
# Datsun 710         22.8  4%  108.0  93%  3.85
# Hornet 4 Drive     21.4  6%  258.0 110%  3.08
# Hornet Sportabout 18.7%  8% 360.0% 175% 3.15%
# Valiant            18.1  6%  225.0 105%  2.76
# Duster 360         14.3  8%  360.0 245%  3.21
# Merc 240D         24.4%  4% 146.7%  62% 3.69%

Для объяснения функция, предоставляемая lapply (и друзьям), обычно передается только одним аргументом. Однако на самом деле это происходит с

lapply(vec, somefunc, a=1, b=1:5, d=someobject)

что происходит на самом деле

somefunc(vec[[1]], a=1, b=1:5, d=someobject)
somefunc(vec[[2]], a=1, b=1:5, d=someobject)
somefunc(vec[[3]], a=1, b=1:5, d=someobject)
...

Я оставлю это вам, чтобы украсить строки дальше, так как выравнивание может быть важно для вас.


Есть идеи?

10000