2016-08-18 109 views
2

我编写了一个可以产生百分比值的函数。当我将值传递给数据框时,格式化会丢失;例如99.90%变成0.9990。一些简单的代码来说明这一点(1列,以表明我不希望在所有列百分比):将百分比值传递到数据框时保留百分比格式

DT = data.frame(matrix(0,nrow=1,ncol=5), stringsAsFactors = FALSE) 
DT[1,1] = 100 
DT[1,2:5] = percent(c(0.9999,0.4567,0.3256,0.7777)) 

DT 

X1  X2  X3  X4  X5 
1 100 0.9999 0.4567 0.3256 0.7777 

我注意到,为了保持百分比的格式,我需要格式化数据帧提前。但是,我只能通过

这工作做柱:

DT[,2] = percent(DT[,2]) 
DT[,3] = percent(DT[,3]) 
... 

但它是一个有点乏味。不幸的是,这两条线下方产生相同的错误

DT[,c(2,3,4,5)] = percent(DT[,c(2,3,4,5)]) 
DT[,2:5] = percent(DT[,2:5]) 

Error in UseMethod("percent") : 
no applicable method for 'percent' applied to an object of class "data.frame" 

这也不起作用:

DT[,2:5] = apply(DT[,2:5],MARGIN = 2 ,FUN=percent) 

因此,我想知道是否有:

  • 的方式来保持对于后者,它未被预先指定格式为时,将值传递到数据帧时的百分比格式化值;或
  • 一种将百分比格式分配给数据帧的大量列的有效方法。
+5

你的第一个代码块在我的系统上产生了'100 100.0%45.7%32.6%77.8%'(即它保留了百分比格式)。你使用哪个'percent()'?我用'scales :: percent()'。 – hrbrmstr

+0

我编辑过这个帖子以包含'library(scales)',因为我认为这个包是'percent()'函数的来源。通过@hrbrmstr阅读评论我意识到,在其他地方可能有其他功能的名称。请指定您使用的库。 – RHertel

+0

我正在使用formattable中的percent()。改变比例可以得到理想的结果。谢谢! – koteletje

回答

0

正如@ hrbrmstr指出的,我必须使用scales::percent()来使我的代码工作。要获得两位数字,我可以使用scales::percent(round(x,4))formattable::percent(x, 2)。指定namespacescalesformattable)允许您使用蒙版包中的函数。