我知道如何按数据表中的列设置值的格式,但是我似乎找不到找到按行设置值的好方法。
为简单起见,我以mtcars
为例。以下代码将第一列和第三列格式化为百分比。但是如何将第一行和第三行设置为百分比?
datatable(mtcars[1:5,]) %>% formatPercentage(c(1,3), digits = 2)
答案 0 :(得分:1)
假设:
DT
...也许在DT
中有一个技巧可以在内部进行此操作而不是浪费数据DT
中使用数字排序或类似的数字相关功能;如果您使用它们,则数字排序将是错误的(例如"88"
在"9"
之前)继续使用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)
...
我将留给您进一步美化琴弦,因为对齐可能对您很重要。