2017-05-24 25 views
0

我真正在这里的目标是在表1中使用的数值为一个月(即一月= 01,...月= 12;年存在作为一个单独的列),找到表2中返回的值来自一个月前的值。我不知道如何处理的问题是表1中的月份是1月份(即2014-01),我将如何返回表2中与2013年12月相关的值(即2013-12)?进行计算分析日期元素,并期待

我在想,有一个程序包有一个过程来减少日期/月的会计年初的条件我上面描述的。我没有将月份和年份列转换为实际日期来完成此任务的问题。

year1 <- c(2013, 2013, 2014) 
year2 <- c(2013, 2013, 2014) 
month1 <- c(04, 08, 01) 
month2 <- c(03, 12, 08) 
value1 <- c(4,6,10) 
value2 <- c(6,3,8) 

df1 <- data.frame(year1, month1, value1) 
df2 <- data.frame(year2, month2, value2) 

鉴于2014-01从DF1的时间组合,从DF2输出预期将是从日期组合2013-12 VALUE2 = 3。

在此先感谢

+2

请显示一个小的可重复的例子和预期的输出 – akrun

+0

你从'lubridate'包检查了'mplus'吗? – Aramis7d

回答

0

可以合并dataframes(一些操作后):

df1 <- data.frame(year1=c(2013, 2013, 2014), month1=c(04, 08, 01), value1=c(4,6,10)) 
df2 <- data.frame(year2=c(2013, 2013, 2014), month2=c(03, 12, 08), value2=c(6,3,8)) 

df1$month2 <- ifelse(df1$month1==1, 12, df1$month - 1) 
df1$year2 <- ifelse(df1$month2==12, df1$year1-1, df1$year1) 
merge(df1, df2, all.x=TRUE) 
# month2 year2 year1 month1 value1 value2 
# 1  3 2013 2013  4  4  6 
# 2  7 2013 2013  8  6  NA 
# 3  12 2013 2014  1  10  3 
+0

谢谢jogo,我很喜欢这个,因为它很简单,它完成了很好的工作。 –

0

这有点一种解决办法,但这里有一个想法,这可能有助于:不是只减1,减2,使用模运算符,然后加入1回。

i = 1:12 
((i - 2) %% 12) + 1 
[1] 12 1 2 3 4 5 6 7 8 9 10 11 
+0

这是计算月份的好主意。但是它不能回答查询其他数据框中的值的问题。 – jogo

1

我觉得它更方便与Date对象的工作,因为它更容易加/减几天或几个月(感谢lubridate包)。所以,这个想法是使用一个月的第一天作为日期字段,而不是年份和月份的单独字段。

另外,我更喜欢data.table进行数据操作。

# initial data 
df1 <- data.frame(year1=c(2013, 2013, 2014), month1=c(04, 08, 01), value1=c(4,6,10)) 
df2 <- data.frame(year2=c(2013, 2013, 2014), month2=c(03, 12, 08), value2=c(6,3,8)) 

library(data.table) # CRAN version 1.10.4 used 
library(lubridate) # CRAN version 1.6.0 used 

# coerce 1st data.frame to data.table, 
# create date from year and month, skip year and month columns, 
# create join date which is one month earlier 
DT1 <- setDT(df1)[, .(date1 = as.Date(sprintf("%4i-%02i-01", year1, month1)), 
         value1)][, join.date := date1 - months(1L),] 

# coerce 2nd data.frame to data.table, 
# create date from year and month, skip year and month columns, 
DT2 <- setDT(df2)[, .(date2 = as.Date(sprintf("%4i-%02i-01", year2, month2)), 
         value2)] 

# right join: take all rows of DT1 
DT2[DT1, on = c(date2 = "join.date")] 
#  date2 value2  date1 value1 
#1: 2013-03-01  6 2013-04-01  4 
#2: 2013-07-01  NA 2013-08-01  6 
#3: 2013-12-01  3 2014-01-01  10