通过添加额外时间来创建数据框

时间:2016-11-15 14:19:02

标签: r dataframe interpolation

我有一个长格式数据框(Main),我想添加更多天,因为我可以在这些添加的日期内插入一个变量。 Main有公司名称(类型),days(day1)和时间不变的变量(region),以及我需要插入的变量(value)。

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

如何创建上述数据名称? 一个侧面问题:为什么我需要删除因子分类,即使我在形成数据帧时没有添加它们?

1 个答案:

答案 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 Schools示例中,他们使用作为来表示别名,这是此版本的SQL所不需要的。< / p>