2016-06-01 16 views
7

Mam coś podobnego do tego:Usuń nadmiarowe kolumn w 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 

zauważyłem, że i obecnie wartości są zawsze takie same, więc chcę, aby usunąć kolumnę out.y. I mam inne kolumny w ten sposób Chcę móc wykryć dowolne .y kolumn, które pasują do kolumn .x i usunąć je po zakończeniu scalania.

+0

można użyć 'wyjątkowy (as.list (DF1))' – akrun

Odpowiedz

10

Jeśli założymy, wszystkie zwolnienia kolumna powinna być usunięta

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

rade.

as.list skonwertuje dane.frame na listę wszystkich swoich kolumn, a duplicated zwróci indeksy dla tych kolumn, które mają wszystkie wartości jako duplikat poprzednio widzianej kolumny.

Nie próbuje to bezpośrednio porównać kolumn .x i .y, ale ma efekt zatrzymania jednej kopii każdej zduplikowanej kolumny, co moim zdaniem jest głównym celem. Z drugiej strony usunie również wszystkie kolumny .x, które są duplikatami innej kolumny .x.


Jeśli chcemy zachować wszystkie .x kolumn, nawet tych, które są duplikatami, dobrym rozwiązaniem może być zrobić filtrowanie przed scaleniu. Zakładając, że masz data_x i data_y które zostaną połączone przez kolumnie „identyfikator”:

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

dziękuję !!! Jest to dobre rozwiązanie, ale działa tylko wtedy, gdy nie ma kolonii, które są różne, ale dla czasu mają wszystkie zerowe wartości. –

+0

Masz rację! Jeśli wszystkie kolumny x powinny być zawsze przechowywane, nawet jeśli są duplikatami, to nie działa. Dodałem inne podejście, które będzie teraz. –

-3

Te odpowiedzi od naszych kolegów są undoubtfully rację, ale prostszym sposobem jest przez:

dataframe[,5] <- NULL 
+2

Wątpię, czy właśnie tego szukają. –

+0

@docendodiscimus wyraźnie nie wykrywa automatycznie kolumn, ale może zrobić lewę, jeśli jesteś leniwy (jak ja) i nie chcesz pisać zbyt wielu linii – adrian1121

+2

I don Zgadzam się z komentarzem dla leniwych. Ponieważ będziesz musiał wymyślić każdą kolumnę _przypadkowo_ w tym podejściu (nie chodzi tylko o 1 kolumnę), podczas gdy leniwy napisałby kod, aby "zautomatyzować" ten proces –

0

I stworzył jedną bardziej zmienna do dataframe który jest repliką 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

prostym przypadku można użyć x <- x [! duplicated (x),] –