如何按R中的行格式化数据表

时间:2018-11-02 22:17:46

标签: r datatable

我知道如何按数据表中的列设置值的格式,但是我似乎找不到找到按行设置值的好方法。

为简单起见,我以mtcars为例。以下代码将第一列和第三列格式化为百分比。但是如何将第一行和第三行设置为百分比?

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

1 个答案:

答案 0 :(得分: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)
...

我将留给您进一步美化琴弦,因为对齐可能对您很重要。