Home Forum Statistica con R Confronto Date di due dataframe

Questo argomento contiene 12 risposte, ha 2 partecipanti, ed è stato aggiornato da  francesca_s 3 mesi, 2 settimane fa.

Stai vedendo 13 articoli - dal 1 a 13 (di 13 totali)
  • Autore
    Articoli
  • #5755

    francesca_s
    Partecipante

    Salve,
    avrei bisogno di un aiuto per effettuare un confronto tra due dataframe distinti. Nello specifico, inizialmente ho due dataframe X e Y di dimensioni differenti, ma in ognuno è presente una colonna relativa alla data già scritta in formato lettura di R (es 2017-01-01); io ho bisogno di creare un nuovo data frame che contenga al suo interno solo le righe di Y che corrispondono alla data presente anche in X.

    Avevo pensato a qualcosa del tipo:

    newdataY<- data.frame()
    for (i in 1:length(Y)) {
    if (Y$Data[i,] == X$Data[i,]) #confronto le date di ogni riga
    newdataY[i]<- Y[i,] #quindi mi copio la riga che corrisponde al requisito
    }

    purtroppo però così non funziona perché è come se non riuscisse a confrontare le date dei due dataframe. Qualcuno ha idea di come effettuare questa operazione? Vi ringrazio anticipatamente.

    #5756
    Davide Massidda
    Davide Massidda
    Moderatore

    Ciao, prova con:

    Y [ Y$Data %in% X$Data , ]

    #5757

    francesca_s
    Partecipante

    Ho tentato, purtroppo se effettuo il comando:

    C<-Y [Y$Data %in% X$Data]

    Mi restituisce un data frame C in cui sono presenti tutte le righe di Y ( quindi non ha preso solo quelle presenti anche in X) ma soprattutto non sono presenti le colonne, quindi ottengo la scritta

    > Y [Y$Data %in% X$Data]
    data frame with 0 columns and 505 rows

    Invece mettendolo nel ciclo così, mi da proprio errore nella scrittura

    newdataY<- data.frame()
    f or (i in 1:length(Y)) {
    if Y [Data$Y %in% Data$X]
    newdataY<- Y[i,]
    }

    #5758
    Davide Massidda
    Davide Massidda
    Moderatore

    Attenta che nel comando che ti ho scritto c’era una virgola che credo tu ti stia dimenticando…

    #5759

    francesca_s
    Partecipante

    Hai ragione, ma mettendo la virgola, ora anzi che darmi le righe, mi restituisce solo il numero di colonne

    C<-Y [Y$Data %in% X$Data,]

    #5760
    Davide Massidda
    Davide Massidda
    Moderatore

    mi restituisce solo il numero di colonne

    Quindi C sarebbe uno scalare che rappresenta il numero di colonne di Y? Questo mi pare davvero molto strano. Potresti postare una porzione di dataset come esempio?

    #5761

    francesca_s
    Partecipante

    Ti riporto il risultato dell’operazione che ottengo lanciando il comando nella console:

    Y [Y$Data %in% X$Data, ]
    [1] X Data Giorno Mese Anno
    [6] TMED TMIN TMAX URMED URMIN
    [11] URMAX PAMED PAMIN PAMAX Pcava
    [16] ETP_harg ETP_erba ETP_forest ETP_suolo ETP_lago1
    [21] ETP_lago2 ETP_cava ETP_BSmonate ETP_EXSmonate
    <0 rows> (or 0-length row.names)

    #5762
    Davide Massidda
    Davide Massidda
    Moderatore

    In realtà a me il comando funziona. Prendi questi due dataset di esempio:

    Y <- data.frame(
        Data = as.Date(c("2015-05-09","2015-08-15","2017-02-26","2016-07-02")),
        V2 = letters[1:2]
    )
    X <- data.frame(
        Data = as.Date(c("2018-04-08","2017-02-26","2016-01-03","2016-07-02")),
        V2 = LETTERS[1:2]
    )
    > X
            Data V2
    1 2018-04-08  A
    2 2017-02-26  B
    3 2016-01-03  A
    4 2016-07-02  B
    > Y
            Data V2
    1 2015-05-09  a
    2 2015-08-15  b
    3 2017-02-26  a
    4 2016-07-02  b

    Ecco cosa succede applicando il comando:

    > Y [Y$Data %in% X$Data,]
            Data V2
    3 2017-02-26  a
    4 2016-07-02  b
    #5765
    Davide Massidda
    Davide Massidda
    Moderatore

    Ok, quello che ottieni tu non è il numero di colonne. Il comando ti restituisce il dataset originario, ma vuoto, perché non ha trovato alcuna corrispondenza fra le due colonne di Y e X.

    Il comando quindi funziona, sono i dati ad avere un problema, perché la colonna Data di Y non ha elementi in comune con la colonna Data di X. Probabilmente i due vettori sono codificati in maniera diversa, magari uno è in formato Date e l’altro character, o cose simili…

    #5766

    francesca_s
    Partecipante

    Non so può essere rilevante che i miei dataset non abbiano la stessa lunghezza?

    #5767

    francesca_s
    Partecipante

    quindi esiste un modo per uniformare la codifica dei data set e poi effettuare il comando %in%?

    #5768
    Davide Massidda
    Davide Massidda
    Moderatore

    No, il problema non è la differente lunghezza, o perlomeno mi sembra improbabile.

    Prova a trasformare in carattere le due colonne Data e poi rilanciare il comando:

    Y$Data <- as.character(Y$Data)
    X$Data <- as.character(X$Data)
    

    Se ancora il comando non funziona, osserva bene i dati e verifica che effettivamente le due colonne siano compatibili. Un consiglio: la prima cosa da fare dopo aver importato un dataset in R è guardarlo con la funzione str: spesso così si scoprono di quelle magagne inimmaginabili 🙂

    #5769

    francesca_s
    Partecipante

    Sono riuscita a risolvere il problema. Il dataset X anche se aveva le date già in formato R non avendo fatto il passaggio:
    X$Data<-as.Date(X$Data, format = “%Y-%m-%d”)
    non le riconosceva ugualmente;
    una volta corretto questo il tuo comando è andato perfettamente!
    Grazie nuovamente dell’aiuto!

Stai vedendo 13 articoli - dal 1 a 13 (di 13 totali)

Devi essere loggato per rispondere a questa discussione.