我有一个长格式数据框(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))
如何创建上述数据名称? 一个侧面问题:为什么我需要删除因子分类,即使我在形成数据帧时没有添加它们?
答案 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
语句中的字符向量解释为因子。这就是语言的定义方式。
请注意,使用a
和b
只是数据框名称的别名。上述陈述与下面的陈述相同:
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>