2017-06-15 2 views
2

Ich versuche, Werte basierend auf dem Wert mehrerer Spalten aus zwei Datasets einzugeben. Ich habe meinen Hauptdatensatz (df1), mit Listen eines Ortes und entsprechenden Daten und df2 besteht aus einer Liste von Temperaturen an allen Orten an jedem möglichen Datum. Beispiel:Kombinieren von Datasets durch den Wert mehrerer Spalten

df1

Location Date 
A   2 
B   1 
C   1 
D   3 
B   3 

DF2

Location Date1Temp Date2Temp Date3Temp 
A   -5   -4   0 
B   2   0   2 
C   4   4   5 
D   6   3   4 

Ich mag würde eine Temperaturgröße in DF1 zu schaffen, nach dem Ort und Datum jeder Beobachtung. Am liebsten würde ich dies mit allen Temperaturdaten im selben Datenrahmen durchführen, aber dies kann bei Bedarf getrennt und nach Datum hinzugefügt werden. Mit den Beispieldaten, möchte ich dies um so etwas zu schaffen:

Location Date Temp 
A   2  -4 
B   1  2 
C   1  4 
D   3  4 
B   3  2 

Ich habe um mit merge und ifelse spielen, haben aber noch nichts dachte noch aus.

+1

Willkommen. Werden Ihre 'df2'-Spaltennamen genau mit den 'df1'-Datumszeilen übereinstimmen? Sollen zum Beispiel "Date1Temp" und "1" dasselbe String- oder Date-Objekt sein? Wenn dies der Fall ist, können Sie df2 mit 'melt' oder' gather' aus einem breiten Datenrahmen in einen langen Datenrahmen transformieren und dann die beiden Datenrahmen verbinden. – ssp3nc3r

Antwort

1

ist es, was Sie brauchen?

library(reshape2) 
library(magrittr) 
df1 <- data.frame(Location= c("A","B","C","D","B"),Date=c(2,1,1,3,3)) 
df2 <- data.frame(Location= c("A","B","C","D"),d1t=c(-5,5,4,6),d2t=c(-4,0,4,3),d3t=c(0,2,5,4)) 


merge(df1,df2) %>% melt(id.vars=c("Location","Date")) 
1

Hier ist, wie das zu tun mit dplyr und tidyr.

Im Grunde wollen Sie gather verwenden, um die DateXTemp Spalten von df2 in zwei Spalten zu schmelzen. Dann möchten Sie verwenden, um die Strings "Date" und "Temp" zu entfernen, um Zahlen zu erhalten, die vergleichbar sind mit dem, was Sie in df1 haben. Da DateXTemp anfänglich Zeichen waren, müssen Sie die verbleibenden Zahlen in Zahlen mit as.numeric umwandeln. Ich verwende dann left_join, um die Tabellen zu verbinden.

library(dplyr);library(tidyr) 
df1 <- data.frame(Location= c("A","B","C","D","B"),Date=c(2,1,1,3,3)) 
df2 <- data.frame(Location= c("A","B","C","D"),Date1Temp=c(-5,5,4,6), 
        Date2Temp=c(-4,0,4,3),Date3Temp=c(0,2,5,4)) 

df2_new <- df2%>% 
      gather(Date,Temp,Date1Temp:Date3Temp)%>% 
      mutate(Date=gsub("Date|Temp","",Date))%>% 
      mutate(Date=as.numeric(Date)) 
df1%>%left_join(df2_new) 

Joining, by = c("Location", "Date") 
    Location Date Temp 
1  A 2 -4 
2  B 1 5 
3  C 1 4 
4  D 3 4 
5  B 3 2 

EDIT

Wie @Sotos vorgeschlagen, können Sie wie so dass in einer Rohrleitung tun:

df2%>% 
    gather(Date,Temp,Date1Temp:Date3Temp)%>% 
    mutate(Date=gsub("Date|Temp","",Date))%>% 
    mutate(Date=as.numeric(Date))%>% 
    left_join(df1,.) 

Joining, by = c("Location", "Date") 
    Location Date Temp 
1  A 2 -4 
2  B 1 5 
3  C 1 4 
4  D 3 4 
5  B 3 2 
+0

Sie können 'left_join' in der Rohrleitung behalten (' ...%>% left_join (df1,.) ') – Sotos

+1

@Sotos Oh, das stimmt! Ich werde es hinzufügen. Vielen Dank. –

Verwandte Themen