Durante l'esperimento con per un'altra domanda here, ho riscontrato un risultato piuttosto strano. Non riesco a capire perché e mi chiedo se quello che sto facendo sia totalmente sbagliato.output imprevisto dall'aggregato
Supponiamo, ho un data.frame
come questo:
df <- structure(list(V1 = c(1L, 2L, 1L, 2L, 3L, 1L),
V2 = c(2L, 3L, 2L, 3L, 4L, 2L),
V3 = c(3L, 4L, 3L, 4L, 5L, 3L),
V4 = c(4L, 5L, 4L, 5L, 6L, 4L)),
.Names = c("V1", "V2", "V3", "V4"),
row.names = c(NA, -6L), class = "data.frame")
> df
# V1 V2 V3 V4
# 1 1 2 3 4
# 2 2 3 4 5
# 3 1 2 3 4
# 4 2 3 4 5
# 5 3 4 5 6
# 6 1 2 3 4
Ora, se mi vuoi mostrare un data.frame
con righe uniche con una colonna aggiuntiva che indica la loro frequenza in df
. Per questo esempio,
# V1 V2 V3 V4 x
# 1 1 2 3 4 3
# 2 2 3 4 5 2
# 3 3 4 5 6 1
ho ottenuto questo risultato usando aggregate
sperimentando come segue:
> aggregate(do.call(paste, df), by=df, print)
# [1] "1 2 3 4" "1 2 3 4" "1 2 3 4"
# [1] "2 3 4 5" "2 3 4 5"
# [1] "3 4 5 6"
# V1 V2 V3 V4 x
# 1 1 2 3 4 1 2 3 4, 1 2 3 4, 1 2 3 4
# 2 2 3 4 5 2 3 4 5, 2 3 4 5
# 3 3 4 5 6 3 4 5 6
Quindi, questo mi ha dato la stringa incollato. Quindi, se dovessi usare length
anziché print
, dovrebbe darmi il numero di tali occorrenze, che è il risultato desiderato, che è il caso (come mostrato di seguito).
> aggregate(do.call(paste, df), by=df, length)
# V1 V2 V3 V4 x
# 1 1 2 3 4 3
# 2 2 3 4 5 2
# 3 3 4 5 6 1
E questo sembrava funzionare. Tuttavia, quando le dimensioni di data.frame
sono 4 * 2500, l'uscita data.frame
è 1 * 2501 anziché 4 * 2501 (tutte le righe sono univoche, quindi la frequenza è 1).
> df <- as.data.frame(matrix(sample(1:3, 1e4, replace = TRUE), nrow=4))
> o <- aggregate(do.call(paste, df), by=df, length)
> dim(o)
# [1] 1 2501
ho testato con piccole data.frames con righe appena uniche e dà l'uscita destra (cambio nrow=40
, per esempio). Tuttavia, quando le dimensioni della matrice aumentano, non sembra funzionare. E proprio non riesco a capire cosa sta andando storto! Qualche idea?
Forse, perché le stringhe diventano troppo lunghe e 'as.character' inserisce interruzioni di riga? – Roland
sì, in alternativa si potrebbe fare 'aggregare (rep (1, nrow (df)), df, FUN = length)'. – flodel
Questo non ha nulla a che fare con 'as.character()' dato che ciascuno degli argomenti è un vettore di lunghezza 1. Per vedere che questa parte funziona, basta fare do.call (paste, df [1: 3,]) '. –