R 通过添加额外时间创建数据帧

R 通过添加额外时间创建数据帧,r,dataframe,interpolation,R,Dataframe,Interpolation,我有一个长格式的数据帧(Main),我想在其中添加更多的天数,因为我可以在这些添加的天数内插入一个变量。Main有固定名称(type)、天(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("

我有一个长格式的数据帧(Main),我想在其中添加更多的天数,因为我可以在这些添加的天数内插入一个变量。Main有固定名称(type)、天(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)
#主数据帧

主使用
合并

merge(Extra, Main, by.x = c("type", "day2"),
                   by.y = c("type", "day1"),
      all.x = T, all.y = T)

请阅读此文以澄清任何混淆:但请注意,在W3学校示例中,他们使用as作为表名别名,这不是此版本的SQL所要求的。

@Hack-R请参阅第一段代码的第2/3行。有些列是factor类,我需要字符类。谢谢。我只是被“分类”这个词而不是“类”的用法弄糊涂了。谢谢。然而,我可能需要一个通用的解决方案,因为“a”和“b”只是为了说明,我有200多个公司名称。@runjumpfly你有多少个公司名称有什么关系?是否将
type
的值与SQL语句中数据帧的任意别名混淆(我不知道sqldf@runjumpfly这只是SQL。您可以通过键入
?sqldf
阅读更多内容。这可以扩展到任何数量的
类型的值或任何字段。您可以有100万个公司名称,代码不会更改。请参阅我添加的一些详细信息。
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
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
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")