2016-11-15 71 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