2017-11-08 3 views
0

ich habe die folgende BeispieldatenPassende 2 Datumsspalten mit ungleicher Länge

X <- c("11/12/2016", "12/12/2016", "13/12/2016","14/12/2016","15/12/2016","16/12/2016", "17/12/2016") 
Y <- c("11/12/2016", "13/12/2016", "14/12/2016", "18/12/2016") 

der Ausgang ich will, ist so etwas wie dieses

X      Y 
11/12/2016   11/12/2016  
12/12/2016    NA 
13/12/2016   13/12/2016 
14/12/2016   14/12/2016 
15/12/2016    NA 
16/12/2016    NA 
17/12/2016    NA 

i den folgenden Code versucht, aber nicht immer die gewünschte Ausgabe

> X <- as.Date(data$X) 
> Y <- as.Date(data$Y) 
> Z <- NA 
> for (i in 1:length(X)) { 
+ if(X[i] == Y){ 
+ Z <- Y} 
+ else NA } 
+0

Ihr Ausgang passt nicht zu Ihrem 'X' und' Y' Eingang – Sotos

+0

Nun, durch die Daten, die Sie zur Verfügung gestellt haben, sollten Sie Fehler in der ersten Zeile selbst erhalten. 'as.Date (X)' –

+0

Entschuldigung mein Schlechter. Editiert jetzt die Eingabe –

Antwort

-1

Die Antwort erhalten!

Sie möchten die Werte eines langen Vektors für Ihren anderen Vektor "übereinstimmen". Dafür ist die Funktion match perfekt, da die Vektorposition der übereinstimmenden Elemente zurückgegeben wird. Zunächst wird die Eingangsdaten (I hinzugefügt einige Korrekturen):

# Input data 
X <- c("11/12/2016", "12/12/2016", "13/12/2016","14/12/2016","15/12/2016","16/12/2016", "17/12/2016") 
Y <- c("11/12/2016", "13/12/2016", "14/12/2016", "18/12/2016") 

# Transform into dates 
X <- as.Date(X,"%d/%m/%Y") 
Y <- as.Date(Y, "%d/%m/%Y") 

Dann ich die data.frame schaffen Z basierend auf dem langen Vektor X und I fügen die angepaßten Werte des Vektors Y:

# Run function match so you can see what can of output generates 
match(x = X, table = Y) 

# Create data.frame 
Z <- data.frame(X = X, 
       # add matched values 
       Y = Y[match(x = X, table = Y)]) 

Hoffe, das hilft.

+0

Das hat funktioniert. Vielen Dank! –

5

Versuchen Sie folgendes:

Ihre Daten:

> X <- c("11/12/2016", "12/12/2016", "13/12/2016","14/12/2016","15/12/2016","16/12/2016", "17/12/2016") 
> Y <- c("11/12/2016", "13/12/2016", "14/12/2016", "18/12/2016") 

neuen Vektor von NA erstellen und das Spiel zu tun:

> Z<-rep(NA,length(X)) 
> Z[which(X %in% Y)]<-X[which(X %in% Y)] 
> Z 
[1] "11/12/2016" NA   "13/12/2016" "14/12/2016" NA   NA   NA 

Ihre Datenrahmen:

> data.frame(X,Y=Z) 
      X   Y 
1 11/12/2016 11/12/2016 
2 12/12/2016  <NA> 
3 13/12/2016 13/12/2016 
4 14/12/2016 14/12/2016 
5 15/12/2016  <NA> 
6 16/12/2016  <NA> 
7 17/12/2016  <NA> 
+0

t brauchen 'was'. Ansonsten sollte diese Lösung anstelle von Nachahmer Santi's akzeptiert worden sein. Zumindest bekommst du +1 von mir ;-) – Tino

+0

Leider gab Santi als richtig die andere Antwort trotz der ich zuerst antwortete :-(. Ich schätze deine +1 sehr, es hilft mir sehr. –

+0

Danke Tino und Henry für deine wunderbare Antworten! –

0

Sie merge verwenden:

X <- c("11/12/2016", "12/12/2016", "13/12/2016","14/12/2016","15/12/2016","16/12/2016", "17/12/2016") 
Y <- c("11/12/2016", "13/12/2016", "14/12/2016", "18/12/2016") 

df_X <- data.frame(X) 

df_Y <- data.frame(X = Y, Y = Y) 

merge(df_X, df_Y, all = TRUE) 
wenn Sie 210

Oder wie ein tidyverse -Ansatz:

library(tidyverse) 
X <- c("11/12/2016", "12/12/2016", "13/12/2016","14/12/2016","15/12/2016","16/12/2016", "17/12/2016") 
Y <- c("11/12/2016", "13/12/2016", "14/12/2016", "18/12/2016") 

df_X <- tibble(X) 

df_Y <- tibble(X = Y, Y = Y) 

full_join(df_X, df_Y) 

Der wichtigste Teil ist, dass Sie Ihre Spalte duplizieren möchten Sie übereinstimmen und nennen Sie es entsprechend, oder verwenden Sie das by -Argument.

Verwandte Themen