2017-05-24 12 views
0

私の実際の目標は、表1の月の数値を使用することです(つまり、1月= 01、12月= 12;年は別の列として表示されます)。返される値が1か月前の値である表2の値。私が対処する方法がわからない問題は、表1の月が1月(つまり2014-01)で、2013年12月(つまり2013-12)に関連する表2の値をどのように戻すかです。計算のための日付要素を解析して検索する

私は上記の年の条件の開始の日/月会計を減額するプロセスがあるパッケージがあると思っています。この仕事を達成するために月と年の列を実際の日付に変換する際に問題はありません。 DF1 2014から01日の組み合わせを考えると

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) 

、DF2から期待される出力は、日付の組み合わせ2013から12から3 = value2のだろう。事前

+2

「lubridate」パッケージから 'mplus'を確認しましたか、少し再現可能な例と期待される出力を表示してください。 – akrun

+0

? – Aramis7d

答えて

0

あなたは(いくつかの操作の後に)データフレームをマージすることができます:

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

ジョゴをありがとう、私はその単純さのためにこれが好きだった、それはうまくいった仕事を得た。 –

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 
関連する問題