Sostituire tutti i valori dei dati.tabella data una condizione

Come sostituire tutti i valori dei dati.tabella data una condizione?

Per esempio

ppp <- data.table(A=1:6,B=6:1,C=1:6,D=3:8)

A B C D
1 6 1 3
2 5 2 4
3 4 3 5
4 3 4 6
5 2 5 7
6 1 6 8

Voglio sostituire tutti i “6” da NA

A B C D
1 NA 1 3
2 5 2 4
3 4 3 5
4 3 4 NA
5 2 5 7
NA 1 6 8

Ho provato qualcosa di simile

ppp[,ifelse(.SD==6,NA,.SD)]

ma non funziona, produce una molto più ampia tabella.

Probabilmente si dovrebbe essere utilizzando una matrice se questo è il genere di cosa che devi fare.

OriginaleL’autore skan | 2016-07-06

2 Replies
  1. 15

    Nativo data.table modo per farlo sarebbe:

    for(col in names(ppp)) set(ppp, i=which(ppp[[col]]==6), j=col, value=NA)
    # Test
    > ppp
        A  B  C  D
    1:  1 NA  1  3
    2:  2  5  2  4
    3:  3  4  3  5
    4:  4  3  4 NA
    5:  5  2  5  7
    6: NA  1 NA  8

    Questo approccio – mentre forse più dettagliato è, tuttavia, sta per essere significativamente più veloce rispetto ppp[ppp == 6] <- NA, perché evita la copia di tutte le colonne.

    Bello. Qualsiasi modo di scrivere, senza un esplicito?
    È necessario loop sopra le colonne.
    Che cosa succede se invece di avere un unico numero (come il “6”) ho avuto un vettore con numeri diversi per le diverse colonne?. Per esempio io dico colonne c(2,5,6,9,11,111) deve essere confrontato con c(==6,==6, >1, >0, ==21,==2)
    Non so perché, ma in risorse del computer, con una molto più reale di dati.tavolo, ci vuole quasi lo stesso tempo per fare con il vostro loop set() che con il ppp[ppp == 6] <- NA via, 63sec vs 74sec.

    OriginaleL’autore mtoto

  2. 11

    Ancora più facile:

    ppp[ppp == 6] <- NA
    
     ppp
        A  B  C  D
    1:  1 NA  1  3
    2:  2  5  2  4
    3:  3  4  3  5
    4:  4  3  4 NA
    5:  5  2  5  7
    6: NA  1 NA  8

    Importante, questo non cambia la sua classe:

    is.data.table(ppp)
    [1] TRUE
    C’è anche is.na(ppp) <- ppp == 6
    Grazie. Ho usato proprio ieri, ma sembrano cadere di nuovo in cattive abitudini.
    Comunque per assegnare i NA da dentro le parentesi quadre?. Quando vedo i dati.esempi di tabella, di solito, tutto ciò che avviene all’interno delle parentesi quadre è fatto con i dati.tabella e è più veloce di qualsiasi operazione, al di fuori, non è vero?.
    Hai ragione, in genere. In questo caso, si potrebbe invece utilizzare set, però, che modifica anche da riferimento. Qualcosa di simile for (col in seq_along(ppp)) set(ppp, i = which(is.na(ppp[[col]])), j = col, v = NA). Vedere mtoto risposta.
    Questo dovrebbe essere di circa veloce come nient’altro, tranne forse set. Ho il sospetto che le differenze di velocità che ci verrà giù per la dimensione dei dati di come questo metodo comporta una copia.

    OriginaleL’autore lmo

Lascia un commento