2014-11-23 62 views
3

的r縮寫()是用於截斷,除其他外,一個數據幀爲設定的長度的列名,與漂亮的檢查,以確保其唯一性是有用的,等:數據幀打印

abbreviate(names(dframe), minlength=2) 
期間縮寫列名

人們可以,當然,使用此功能,可在位縮寫列名,然後打印出改變的數據幀

>>names(dframe) <- abbreviate(names(dframe), minlength=2) 
>>dframe 

但我想打印出來的數據幀用縮寫列名更改數據框架在過程中。希望這可以通過print()調用中的一個簡單格式選項完成,儘管我通過print.data.frame等打印和格式方法的幫助頁搜索沒有找到任何明顯的解決方案(可用選項似乎更適合格式化列值,而不是他們的名字)。因此,print()或format()是否有任何可以在列名稱上調用abbreviate()的選項?如果沒有,有沒有辦法在傳遞給print()之前將abbreviate()應用於數據框的列名,而不改變傳遞的數據框?

我想的越多,我認爲唯一的方法就是將print()與已經縮寫的列名的數據框的副本一起傳遞。但是這對我來說不是一個解決方案,因爲我不想在互動會話期間更新原始文件的情況下不斷更新此副本。原始列名稱必須保持不變,因爲我使用哪些(colnames(dframe)==「name_of_column」)與數據進行接口。

我的終極目標是在像服務器審計員這樣的ssh應用程序中工作時,在我的移動設備的小屏幕上更好地遠程工作。如果列名縮寫爲只有2-3個字符,我仍然可以識別它們,但可以在屏幕上顯示更多數據。也許甚至有R包更適合濃縮印刷?

回答

3

你可以定義你自己的打印方法

print.myDF <- function(x, abbr = TRUE, minlength = 2, ...) { 
    if (abbr) { 
     names(x) <- abbreviate(names(x), minlength = minlength) 
    } 
    print.data.frame(x, ...) 
} 

那麼該類myDF添加到數據和打印

class(iris) <- c("myDF", class(iris)) 
head(iris, 3) 
# S.L S.W P.L P.W  Sp 
# 1 5.1 3.5 1.4 0.2 setosa 
# 2 4.9 3.0 1.4 0.2 setosa 
# 3 4.7 3.2 1.3 0.2 setosa 
print(head(iris, 3), abbr = FALSE) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1   5.1   3.5   1.4   0.2 setosa 
# 2   4.9   3.0   1.4   0.2 setosa 
# 3   4.7   3.2   1.3   0.2 setosa 
print(head(iris, 3), minlength = 5) 
# Spl.L Spl.W Ptl.L Ptl.W Specs 
# 1 5.1 3.5 1.4 0.2 setosa 
# 2 4.9 3.0 1.4 0.2 setosa 
# 3 4.7 3.2 1.3 0.2 setosa 
+1

對,剛剛偷BondedDust的回答:-)好吧,srsly,爲'abbr'增加'class'和默認參數很好。 – 2014-11-23 13:05:05

+0

拍攝! Duh功能已經可以與副本一起工作,因此不需要修改原始文件。我也發現定義一個'class'是一個非常乾淨的解決方案。這將成爲這個noob未來編程習慣的一部分:) – courtyardz 2014-11-24 00:33:08

1

剛剛改寫print.data.frame

print.data.frame <- 
       function(x) setNames(print(x), 
           abbreviate(names(dframe), minlength=2)) 

(你可能會想一個輔助printfull.data.frame給你第一個副本print.data.frame。)