Rozważmy następujący Vector, x
Stosują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.
nadal jest wektorem numeryczny. spróbuj 'unclass (df $ x)' lub 'df $ x + 10^6'. (zauważ, że wprowadziłem korektę w funkcji) – Jthorpe
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
, 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