首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并每日data.frame和年度data.frame

合并每日data.frame和年度data.frame
EN

Stack Overflow用户
提问于 2014-04-18 19:35:53
回答 2查看 305关注 0票数 0

我想合并两个数据帧。一个包含每日数据,另一个包含年度数据。我该怎么做呢?

代码语言:javascript
复制
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

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2014-04-18 19:44:04

您有几个选项:

选项1:使用package lubridate

代码语言:javascript
复制
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包更像是一种投资(强烈推荐),它有处理日期的内置函数。它也有很多其他奇妙的特性(快速合并和分组,更低的内存使用),并将使合并过程更有效率。

票数 1
EN

Stack Overflow用户

发布于 2014-04-18 20:45:39

以下是一些解决方案。在这些(除了sqldf解决方案之外)中,我们将使用以下函数:

代码语言:javascript
复制
d2y <- function(date) as.numeric(substring(date, 7))
lower.names <- function(DF) setNames(DF, tolower(names(DF)))

Base R这里是一个基本解决方案。虽然这不是示例中的情况,但为了安全起见,如果mydf中的日期在annual中没有相应的年份,我们将执行左连接。left join将确保不会删除这些日期:

代码语言:javascript
复制
mydf2 <- transform(mydf, year = d2y(date))
merge(mydf2, lower.names(annual), all.x = TRUE)

sqldf 这里是一个sqldf解决方案。这会更简洁一些,因为我们不需要物化mydf2,而是可以直接连接复杂的逻辑表达式。请注意,此解决方案不使用d2ylower.names

代码语言:javascript
复制
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

代码语言:javascript
复制
library(dplyr)

mydf %.% 
  mutate(year = d2y(date)) %.%
  left_join(lower.names(annual))

data.table下面我们可以使用data.table的setnames,如果我们愿意修改annual的话,但这里选择了非破坏性的setNames

代码语言:javascript
复制
library(data.table)

key <- c("company", "year")
mydt <- setkeyv(data.table(mydf)[, year := d2y(date)], key)
data.table(lower.names(annual), key = key)[mydt]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23153307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档