2016-11-15 25 views
-1

我有一個長格式的數據框(主),我想添加更多的日子,因爲我可以在這些添加的日子內插一個變量。 Main具有公司名稱(類型),天數(day1)和時間不變的變量(region)以及需要內插的變量(值)。通過添加額外時間創建數據框

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

這是插值所需的數據框:

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

如何創建上述datafame? 一個側面的問題:爲什麼我需要刪除因子分類,即使我沒有在形成數據框時添加它們?

+0

@ Hack-R請參閱第一個代碼塊的第2/3行。有些列是因子類,我需要字符類。 – runjumpfly

+0

謝謝。我只是使用「分類」一詞而不是「類」來混淆。 –

回答

1

使用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 

使用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 

您需要stringsAsFactors=FALSE的原因是R將默認將data.frame語句中的字符向量解釋爲因子。這就是語言的定義。

請注意,使用ab只是數據框名稱的別名。上面的說法是一樣的下面的一個:

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

請閱讀此澄清任何混淆:http://www.w3schools.com/sql/sql_alias.asp但要注意的是,在他們使用對未通過所需的表的名稱混淆的W3學校例子這個版本的SQL。

+0

謝謝。但是,我可能需要一個通用的解決方案,因爲「a」和「b」只是爲了說明,我有超過200個公司名稱。 – runjumpfly

+0

@runjumpfly你有多少公司名稱有什麼關係?您是否將'type'的值與SQL語句中數據框的任意別名混淆? –

+0

:(我不知道sqldf – runjumpfly