2016-11-23 6 views
3

1. Fall

ich zwei data.frames wie folgt erhalten haben:Merge data.frame nach Datum (Jahr und Monat)

df1 = read.table(text = 'Date ID 
1980-12-01 2 
1982-11-01 1 
1990-01-01 6 
1993-07-01 9', header = TRUE) 

df2 = read.table(text = 'Date Var 
1980-12-17 8 
1982-11-07 9 
1990-01-19 10 
1993-07-20 22', header = TRUE) 

ich mit DF2 durch die Spalte Datum df1 fusionieren müssen aber durch nur unter Berücksichtigung von Jahr und Monat, auch weil sonst die Zusammenführung nicht funktioniert (weil die Tage anders sind).

sollte Meine Ausgabe wie folgt sein:

Date ID Var 
1980-12 2 8 
1982-11 1 9 
1990-01 6 10 
1993-07 9 22 

ich die Tage in den Datum Spalten entfernen betrachtet, aber ich würde gerne wissen, ob es einen schnelleren Weg, dies zu tun. Ich überprüfte auch und es scheint, dass niemand diese Frage zuvor gestellt hat.

Dank

#

UPDATE

2. Fall

Wie in den Kommentaren vorgeschlagen, was ist, wenn ich in einer data.frame mehrere Beobachtungen im selben Jahr und Monat erhalten?

z.B.

df1 = read.table(text = 'Date ID #as 1st Case 
1980-12-01 2 
1982-11-01 1 
1990-01-01 6 
1993-07-01 9', header = TRUE) 

df3 = read.table(text = 'Date Var 
    1980-12-17 8 
    1980-12-29 4 
    1980-12-30 1 
    1982-11-07 9 
    1982-11-12 1 
    1990-01-19 10 
    1990-01-22 21 
    1993-07-20 22 
    1993-07-26 12', header = TRUE) 

Meine neue Ausgabe sollte sein:

Date Var ID 
1980-12 8  2 
1980-12 4  2 
1980-12 1  2 
1982-11 9  1 
1982-11 1  1 
1990-01 10 6 
1990-01 21 6 
1993-07 22 9 
1993-07 12 9 
#

UPDATE

3. Fall

Was passiert, wenn ich mehrere Beobachtungen im selben Jahr und Monat bekam sowohl in der data.frames?

df4 = read.table(text = 'Date ID 
    1980-12-01 1 
    1980-12-01 2 
    1982-11-01 3 
    1982-11-01 4 
    1990-01-01 5 
    1990-01-01 6 
    1993-07-01 7 
    1993-07-01 8', header = TRUE) 

df3 = read.table(text = 'Date Var  #as 2nd Case 
    1980-12-17 8 
    1980-12-29 4 
    1980-12-30 1 
    1982-11-07 9 
    1982-11-12 1 
    1990-01-19 10 
    1990-01-22 21 
    1993-07-20 22 
    1993-07-26 12', header = TRUE) 

Das sollte neue Ausgabe sein:

Date  Var ID 
    1980-12-17 8 1 
    1980-12-17 8 2 
    1980-12-29 4 1 
    1980-12-29 4 2 
    1980-12-30 1 1 
    1980-12-30 1 2 
    1982-11-07 9 3 
    1982-11-07 9 4 
    1982-11-12 1 3 
    1982-11-12 1 4 
    1990-01-19 10 5 
    1990-01-19 10 6 
    1990-01-22 21 5 
    1990-01-22 21 6 
    1993-07-20 22 7 
    1993-07-20 22 8 
    1993-07-26 12 7 
    1993-07-26 12 8 
+1

Zunächst einmal fusionieren, +1 für reproduzierbare Daten setzen und erwartete Ausgabe;) – Tensibai

+1

was, wenn Sie haben mehrere Beobachtungen aus dem gleichen Monat? – mtoto

+0

Ich habe meine Frage aktualisiert. Das ist eigentlich mein letztes Ziel. Danke, dass du das herausgibst. –

Antwort

1

Wir haben das 'Datum' zu Date Klasse umwandeln, format zu Jahr-Monat-Format sowohl in dem Datensatz und merge es zusammen.

merge(transform(df1, Date = format(as.Date(Date), "%Y-%m")), 
      transform(df2, Date = format(as.Date(Date), "%Y-%m"))) 
#  Date ID Var 
#1 1980-12 2 8 
#2 1982-11 1 9 
#3 1990-01 6 10 
#4 1993-07 9 22 

Oder wenn es viele Datensätze sind, legen Sie sie in einem list und machen die Transformation und

Reduce(function(...) merge(...), 
    lapply(mget(paste0("df", 1:2)), transform, Date = format(as.Date(Date), "%Y-%m"))) 
+0

Hallo @akrun, könntest du bitte mein Update sehen? oder ich werde gezwungen sein, die Annahme der Antwort zu entfernen. Danke vielmals. –

3

Sie müssen das Datum in Monat und Jahr-Format zu formatieren. dann machst du eine normale Zusammenführung.

df1$my=format(as.Date(df1$Date), "%Y-%m") 
df2$my=format(as.Date(df2$Date), "%Y-%m") 
merge(df1,df2, by='my') 

Für mehrere Beobachtungen im selben Jahr und Monat würde dies immer noch funktionieren.

df1$my=format(as.Date(df1$Date), "%Y-%m") 
df3$my=format(as.Date(df3$Date), "%Y-%m") 
merge(df1,df3, by='my') 
     my  Date.x ID  Date.y Var 
1 1980-12 1980-12-01 2 1980-12-17 8 
2 1980-12 1980-12-01 2 1980-12-29 4 
3 1980-12 1980-12-01 2 1980-12-30 1 
4 1982-11 1982-11-01 1 1982-11-07 9 
5 1982-11 1982-11-01 1 1982-11-12 1 
6 1990-01 1990-01-01 6 1990-01-19 10 
7 1990-01 1990-01-01 6 1990-01-22 21 
8 1993-07 1993-07-01 9 1993-07-20 22 
9 1993-07 1993-07-01 9 1993-07-26 12 

Für Update 3 kann man verwenden

merge(df4,df3, by='my', all = T) 
+0

Sie haben Recht, die Seite hat sich nicht aktualisiert, Sie haben ungefähr 20 oder 30 Sekunden vor – akrun

+1

gepostet Vielen Dank für die Kommentare und froh zu wissen, dass Sie Inspiration von meinen Beiträgen bekommen haben. – akrun

+0

Hi @ChirayuChamoli, könntest du bitte mein Update sehen? Das ist eigentlich das, was ich wirklich tun muss. Vielen Dank. –

Verwandte Themen