2016-08-18 120 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)允許您使用蒙版包中的函數。