2016-11-15 3 views
-1

Ich habe einen langen Formatdatenrahmen (Main), wo ich mehr Tage hinzufügen möchte, um eine Variable über diese hinzugefügten Tage interpolieren zu können. Der Main hat einen festen Namen (Typ), Tage (Tag1) und eine zeitinvariante Variable (Region) und eine Variable (Wert), die ich interpolieren muss.Erstellen eines Datenrahmens durch Hinzufügen zusätzlicher Zeit

#Main dataframe 
Main<-data.frame(type=as.character(c("a","a","b","b"), stringsAsFactors=FALSE), day1=c(1,3,1,3), region=as.character(c("north","north", "south", "south"),stringsAsFactors=FALSE), Value=c(10, 30, 35, 50)) 
AA<-sapply(Main, is.factor) 
Main[AA]<-lapply(Main[AA], as.character) 
Main<- Main%>% arrange(type, day1) 
#Dataframe that has additional days for interpolation 
type<-unique(Main$type) 
type<- rep(type, each=3) 
day2<- rep(1:3,2) 
Extra<-cbind(type, day2) 
Extra<-data.frame(Extra) 

Dies ist die erforderliche Datenrahmen für die Interpolation:

New<-data.frame(type=as.character(c("a","a","a","b","b","b"), stringsAsFactors=FALSE),day1=c(1,NA,3,1,NA,3), day2=c(1,2,3,1,2,3), region=as.character(c("north","north","north","south", "south", "south"),stringsAsFactors=FALSE), Value=c(10,NA, 30, 35,NA, 50)) 

Wie kann ich den oben genannten datafame schaffen? Eine Nebenfrage: Warum muss ich die Faktorklassifizierung entfernen, obwohl ich sie beim Erstellen des Datenrahmens nicht hinzugefügt habe?

+0

@ Hack-R Bitte siehe Zeile 2/3 des ersten Codeblocks. Einige Spalten sind Faktorklasse und ich brauche Zeichenklasse. – runjumpfly

+0

Danke. Ich war nur verwirrt, als ich das Wort "Klassifikation" anstelle von "Klasse" benutzte. –

Antwort

1

Mit merge:

merge(Extra, Main, by.x = c("type", "day2"), 
        by.y = c("type", "day1"), 
     all.x = T, all.y = T) 
type day2 region Value 
1 a 1 north 10 
2 a 2 <NA> NA 
3 a 3 north 30 
4 b 1 south 35 
5 b 2 <NA> NA 
6 b 3 south 50 

Mit sqldf:

library(sqldf) 
sqldf("select a.type, 
       b.day1, 
       a.day2, 
       b.region, 
       b.Value 
     from Extra a left join Main b on 
     a.type = b.type and a.day2 = b.day1") 
type day1 day2 region Value 
1 a 1 1 north 10 
2 a NA 2 <NA> NA 
3 a 3 3 north 30 
4 b 1 1 south 35 
5 b NA 2 <NA> NA 
6 b 3 3 south 50 

Der Grund, warum Sie stringsAsFactors=FALSE benötigen, ist, dass R standardmäßig Zeichenvektoren in der data.frame-Anweisung als Faktoren interpretiert. So ist die Sprache definiert.

Beachten Sie, dass die Verwendung von a und b nur Aliase für die Datenrahmennamen sind. Die obige Aussage ist das gleiche wie der folgenden Liste:

sqldf("select one.type, 
       two.day1, 
       one.day2, 
       two.region, 
       two.Value 
     from Extra one left join Main two on 
     one.type = two.type and one.day2 = two.day1") 

Bitte dies lesen, um Verwechslungen zu klären: http://www.w3schools.com/sql/sql_alias.asp aber beachten Sie, dass in der W3 Schulen Beispiel sie als für Tabellennamen Aliasing verwenden, die nicht durch erforderlich ist diese Version von SQL.

+0

Danke. Allerdings brauche ich möglicherweise eine allgemeine Lösung, da "a" und "b" nur zur Veranschaulichung dienen. Ich habe mehr als 200 Firmennamen. – runjumpfly

+0

@runjumpfly Was ist wichtig, wie viele Firmennamen Sie haben? Verwechseln Sie die Werte von "type" mit den willkürlichen Aliasen der Datenrahmen in der SQL-Anweisung? –

+0

:(Ich habe keine Kenntnis von sqldf – runjumpfly

Verwandte Themen