zusammenführen Löschen Sie redundante Spalten in R




r zeilen löschen (3)

Ich habe etwas ähnliches:

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

Ich habe bemerkt, dass die Werte für In und Out immer gleich sind, daher möchte ich die Spalte out.y löschen. Und ich habe andere Spalten wie diese Ich möchte in der Lage sein, .y Spalten zu erkennen, die .x Spalten entsprechen und lösche sie, nachdem ich die Zusammenführung gemacht habe.


Wenn wir davon ausgehen, dass alle Spaltenredundanzen entfernt werden sollten

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

wird den Trick machen.

as.list konvertiert das data.frame in eine Liste aller Spalten und duplicated die Indizes für die Spalten, die alle Werte als Duplikat einer zuvor gesehenen Spalte enthalten.

Dies versucht nicht direkt, .x- und .y-Spalten zu vergleichen, sondern bewirkt, dass eine Kopie jeder duplizierten Spalte beibehalten wird, von der ich annehme, dass sie das Hauptziel ist. Auf der anderen Seite werden auch alle .x-Spalten entfernt, die Duplikate einer anderen .x-Spalte sind.

Wenn wir alle .x-Spalten beibehalten möchten, auch wenn es sich um Duplikate handelt, könnte es eine gute Lösung sein, vor der Zusammenführung zu filtern. Angenommen, Sie haben data_x und data_y , die mit der Spalte "identifier" zusammengeführt werden:

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"))

Ich habe eine weitere Variable zu Ihrem Datenrahmen erstellt, die eine Kopie von out.y ist

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

Diese Antworten unserer Kollegen sind zweifellos richtig, aber eine einfachere Art und Weise ist:

dataframe[,5]  <- NULL




merge