Как форматировать данные по строкам в R - PullRequest
0 голосов
/ 03 ноября 2018

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

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

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

1 Ответ

0 голосов
/ 03 ноября 2018

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

  • это решение 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)
...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...