Предположения:
- это решение 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)
...
Я оставлю на ваше усмотрение дальнейшее украшение струн, так как выравнивание может быть важно для вас.