2016-06-01 24 views
7

Ho qualcosa di simile a questo:eliminare colonne ridondanti in R

date  pgm  in.x  logs  out.y 
20130514 na  12  j1   12 
20131204 z2  03  j1   03 
20130516 a01  04  j0   04 
20130628 z1  05  j2   05 

ho notato che il dentro e fuori i valori sono sempre gli stessi quindi voglio eliminare la colonna out.y. E ho altre colonne come questa che voglio essere in grado di rilevare tutte le colonne .y che corrispondono alle colonne .x e cancellarle dopo l'unione.

+0

è possibile utilizzare 'unico (as.list (DF1))' – akrun

risposta

10

Se assumiamo tutte le ridondanze delle colonne devono essere rimossi

no_duplicate <- data_set[!duplicated(as.list(data_set))] 

farà il trucco.

as.list convertirà il data.frame in un elenco di tutte le sue colonne e duplicated restituirà indici per quelle colonne che hanno tutti i valori come duplicato di una colonna precedentemente vista.

Questo non tenta direttamente di confrontare le colonne .x e .y, ma ha l'effetto di mantenere una copia di ciascuna colonna duplicata, che presumo sia l'obiettivo principale. D'altra parte, rimuoverà anche eventuali colonne .x che sono duplicati di un'altra colonna .x.


Se vogliamo mantenere tutte le colonne .x, anche quelli che sono duplicati, una buona soluzione potrebbe essere quella di fare il filtraggio prima l'unione. Supponendo di avere data_x e data_y che sarà fusa per colonna "identificatore":

data_y_nonredundant <- data_y[!(as.list(data_y) %in% as.list(data_x) & names(data_y)!="identifier")] 
data <- merge(data_x, data_y_nonredundant, by=c("identifier")) 
+1

Grazie mille !!! Questa è una buona soluzione, ma funziona solo quando non hai coluns diversi ma per il momento in cui hai tutti i valori zero. –

+0

Hai ragione! Se tutte le x-colonne devono essere sempre mantenute, anche se sono duplicati, non funziona. Ho aggiunto un altro approccio che sarà ora. –

-3

Queste risposte dai nostri colleghi sono undoubtfully ragione, ma una maniera più semplice è da:

dataframe[,5] <- NULL 
+2

Dubito che questo sia quello che stanno cercando –

+0

@docendodiscimus chiaramente non rileva automaticamente le colonne ma può fare il trucco se sei pigro (come me) e non vuoi scrivere troppe righe – adrian1121

+2

I don Sono d'accordo sul commento per le persone pigre. Perché dovrai calcolare ogni colonna _manualmente_ in questo approccio (non si tratta solo di 1 colonna) mentre una persona pigra scriverebbe codice per "automatizzare" questo processo –

0

ho creato uno più variabile al tuo dataframe che è replica di out.y

x <- data.frame(date = c("20130514","20131204","20130516","20130628"), 
    pgm = c(NA, "z2", "a01", "z1"), in.x= c(12, 3, 4, 5), out.y= c(12, 3, 4, 5),new.y = c(12, 3, 4, 5)) 

y <- x[grepl(".x|.y",colnames(x))] 

in.x out.y new.y 
1 12 12 12 
2 3  3  3 
3 4  4  4 
4 5  5  5 

y$in.x==y[,c("out.y","new.y")] 
    out.y new.y 
[1,] TRUE TRUE 
[2,] TRUE TRUE 
[3,] TRUE TRUE 
[4,] TRUE TRUE 

x <- x[,1:3] 

     date pgm in.x 
1 20130514 <NA> 12 
2 20131204 z2 3 
3 20130516 a01 4 
4 20130628 z1 5 
+0

semplice x <- x [! duplicato (x),] –