2017-08-22 33 views
1

knitr :: kable()如何忽略格式化整數列並格式化所有其他數字列?使用數字和整數列格式化降價表

例子:

knitr::kable(x = as.data.frame(rbind(c(1L, 21.211), c(2L, 31.233))), format.args = list("digits" = 2, "nsmall" = 2, "big.mark" = ".", "decimal.mark" = ",", "scientific" = FALSE))

它返回:

[1] "| V1| V2|" "|----:|-----:|" "| 1,00| 21,21|" "| 2,00| 31,23|"

,我怎麼輸出是這樣的:

[1] "| V1| V2|" "|----:|-----:|" "| 1| 21,21|" "| 2| 31,23|"

感謝

+0

你見過這個https://stackoverflow.com/questions/30949768/r-vary-by-row-the-rounding-of-digits-produced-by-knitrkable –

+0

感謝您的答覆。 但我正在尋找更「自動化」的方法..也許有可能在這篇文章中提到一些可以處理這個問題的邏輯。 –

回答

1

knitr::kable始終將相同的格式應用於所有數字列,因此您唯一的選擇是在調用它之前先轉換爲字符列,如J_F的參考所示。

我懷疑它是否可以完全自動化。您首先使用的數據框只有numeric列; integer值由c()轉換爲numeric。 (您可以通過不同方式構建數據幀避免了這一點。)假設你有一些方法來構建指示哪些列你想以何種方式格式化的載體,可以自動做這樣的事情:

df <- as.data.frame(rbind(c(1L, 21.211), c(2L, 31.233))) 
intcolumn <- c(TRUE, FALSE) # This is hard to automate 

for (i in seq_len(ncol(df))) { 
    if (intcolumn[i]) 
    df[[i]] <- format(df[[i]]) 
    else 
    df[[i]] <- format(df[[i]], digits = 2, nsmall = 2, big.mark = ".", 
         decimal.mark = ",", scientific = FALSE) 
} 
knitr::kable(df, align = "r") # right align as for numeric column 

這將產生

| V1| V2| 
|--:|-----:| 
| 1| 21,21| 
| 2| 31,23|