2015-01-27 12 views
5

Rozważmy następujący Vector, xStosując metodę druku wektorze w ramce danych

x <- c(6e+06, 75000400, 743450000, 340000, 4300000) 

Pragnę wydrukować x w milionach, więc napisałem metodę drukowania i przypisać klasę do x

print.million <- function(x, ...) { 
    x <- paste0(round(x/1e6, 1), "M") 
    NextMethod(x, quote = FALSE, ...) 
} 

class(x) <- "million" 

Teraz x wydrukuje, jak chcę, z wartościami liczbowymi również pozostaną nienaruszone.

x 
# [1] 6M  75M 743.5M 0.3M 4.3M 
unclass(x) 
# [1] 6000000 75000400 743450000 340000 4300000 

Oto problem, który chciałbym rozwiązać. Kiedy wstawiam x do ramki danych, metoda drukowania przestaje obowiązywać, a wartości liczbowe x są drukowane normalnie.

(df <- data.frame(x = I(x))) 
#   x 
# 1  6e+06 
# 2 75000400 
# 3 743450000 
# 4 340000 
# 5 4300000 

Klasa kolumny x jest jeszcze klasa „milion”, który jest na pewno to, co chcę.

df$x 
# [1] 6M  75M 743.5M 0.3M 4.3M 
class(df$x) 
# [1] "AsIs" "million" 

Jak mogę umieścić x w ramce danych, a także utrzymać swoją metodę drukowania? Próbowałem wszystkich argumentów do data.frame() i naprawdę nie wiem, gdzie skręcić dalej.

Pożądanym rezultatem jest poniższa ramka danych, gdzie x jest nadal klasą "milion", zachowuje swoje podstawowe wartości liczbowe, a także drukuje w ramce danych tak jak wtedy, gdy jest to wektor wydrukowany w konsoli.

#  x 
# 1  6M 
# 2 75M 
# 3 743.5M 
# 4 0.3M 
# 5 4.3M 

Uwaga: To pytanie odnosi się do drugiej części an answer I posted earlier.

Odpowiedz

6

trzeba format sposób i metodę as.data.frame, takie jak:

x <- c(6e+06, 75000400, 743450000, 340000, 4300000) 
class(x) <- 'million' 
format.million <- function(x,...)paste0(round(unclass(x)/1e6, 1), "M") 
as.data.frame.million <- base:::as.data.frame.factor 
data.frame(x) 
+0

nadal jest wektorem numeryczny. spróbuj 'unclass (df $ x)' lub 'df $ x + 10^6'. (zauważ, że wprowadziłem korektę w funkcji) – Jthorpe

+0

Nie nazywam 'df <- data.frame (x = format (x))'. po prostu print.data.frame "wywołuje metodę' format', aby określić sposób drukowania danych.frame na konsolę – Jthorpe

+1

, jeśli czytasz 'as.data.frame.factor', który nie polega na żadnym z atrybutów czynników i dba o wszystko, czego potrzebujesz, aby utworzyć obiekt data.frame z wektora. – Jthorpe

Powiązane problemy