【问题标题】:Creating a dataframe by adding additional time通过添加额外时间来创建数据框
【发布时间】:2016-11-15 14:19:01
【问题描述】:

我有一个长格式数据框(主要),我想在其中添加更多天数,因为我可以在这些添加的天数内插入一个变量。 Main 有公司名称(类型)、天数(day1)、一个时不变变量(区域)和一个我需要插值的变量(值)。

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

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

【问题讨论】:

  • @Hack-R 请看第一个代码块的 2/3 行。有些列是因子类,我需要字符类。
  • 谢谢。我只是对使用“分类”这个词而不是“类”感到困惑。

标签: r dataframe interpolation


【解决方案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 示例中,他们使用 as 作为此版本 SQL 不需要的表名别名。

【讨论】:

  • 谢谢。但是,我可能需要一个通用的解决方案,因为“a”和“b”只是为了说明,我有 200 多个公司名称。
  • @runjumpfly 你有多少公司名字有什么关系?您是否将type 的值与 SQL 语句中数据框的任意别名混淆了?
  • :(我对sqldf一无所知
  • @runjumpfly 这只是 SQL。您可以键入?sqldf 阅读更多内容。这可以扩展到type 的任意数量的值或任何字段。您可以拥有 100 万个公司名称,而代码不会改变。
  • 请看我添加了一些细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 2010-12-18
相关资源
最近更新 更多