我想合并两个数据帧。一个包含每日数据,另一个包含年度数据。我该怎么做呢?
date <- c("05.06.2001","02.10.2003","06.12.2004","01.01.2001","01.04.2003")
company <- c(1,1,1,2,2)
mydf <- data.frame(date, company)
mydf
# date company
# 1 05.06.2001 1
# 2 02.10.2003 1
# 3 06.12.2004 1
# 4 01.01.2001 2
# 5 01.04.2003 2
# annual data
YEAR <- c(2001, 2002, 2003, 2004, 2005, 2001, 2002, 2003, 2004, 2005)
COMPANY <- c(1,1,1,1,1,2,2,2,2,2)
VARIABLE <- c(120, 230, 99, 38, 21, 20, 24, 420, 203, 180)
annual <- data.frame(YEAR, COMPANY, VARIABLE)
annual
# YEAR COMPANY VARIABLE
# 1 2001 1 120
# 2 2002 1 230
# 3 2003 1 99
# 4 2004 1 38
# 5 2005 1 21
# 6 2001 2 20
# 7 2002 2 24
# 8 2003 2 420
# 9 2004 2 203
# 10 2005 2 180
# the output should be:
# date company VARIABLE
# 1 05.06.2001 1 120
# 2 02.10.2003 1 99
# 3 06.12.2004 1 38
# 4 01.01.2001 2 20
# 5 01.04.2003 2 420谢谢!
发布于 2014-04-18 19:44:04
您有几个选项:
选项1:使用package lubridate
require(luubridate) ## install it first if you don't have it
mydf$year <- year(mydf$date)
merged.df <- merge(mydf, annual, by.x=c('company', 'year'), by.y=c('COMPANY', 'YEAR'))选项2:使用data.table
data.table包更像是一种投资(强烈推荐),它有处理日期的内置函数。它也有很多其他奇妙的特性(快速合并和分组,更低的内存使用),并将使合并过程更有效率。
发布于 2014-04-18 20:45:39
以下是一些解决方案。在这些(除了sqldf解决方案之外)中,我们将使用以下函数:
d2y <- function(date) as.numeric(substring(date, 7))
lower.names <- function(DF) setNames(DF, tolower(names(DF)))Base R这里是一个基本解决方案。虽然这不是示例中的情况,但为了安全起见,如果mydf中的日期在annual中没有相应的年份,我们将执行左连接。left join将确保不会删除这些日期:
mydf2 <- transform(mydf, year = d2y(date))
merge(mydf2, lower.names(annual), all.x = TRUE) sqldf 这里是一个sqldf解决方案。这会更简洁一些,因为我们不需要物化mydf2,而是可以直接连接复杂的逻辑表达式。请注意,此解决方案不使用d2y或lower.names
library(sqldf)
sqldf("select mydf.company, year, date, VARIABLE as variable
from mydf left join annual
on mydf.company = annual.company and year = substr(date, 7)")dplyr
library(dplyr)
mydf %.%
mutate(year = d2y(date)) %.%
left_join(lower.names(annual))data.table下面我们可以使用data.table的setnames,如果我们愿意修改annual的话,但这里选择了非破坏性的setNames:
library(data.table)
key <- c("company", "year")
mydt <- setkeyv(data.table(mydf)[, year := d2y(date)], key)
data.table(lower.names(annual), key = key)[mydt]https://stackoverflow.com/questions/23153307
复制相似问题