2016-04-06 12 views
0

で見つけてください。コロンビアでは、月曜日の15日と最後の日に給与が(主に)2週間ごとに支払われます。私は売り上げ日から新しい変数を生成しようとしています。売り上げ量との相関が高いと期待しています:最後の給料日からの日数、私は単純な差として計算することができます。支払日の日付を持つ。最も近い二週間の日付をR

このように私は、我々は唯一の営業日数の世話ウィッヒからその日付の売上のデータフレームaを持っている:

structure(list(date = structure(c(1423121832, 1423988603, 1424779384, 
1425132001, 1427800333), tzone = "UTC", class = c("POSIXct", 
"POSIXt"))), .Names = "date", row.names = c(NA, -5L), class = "data.frame") 

私はそれぞれに最も近い給料日のベクトルを生成したいですしかし、毎月末には対処できませんでした。私が手ウィッヒから

library(lubridate) 
cbind(a, 
     basedate = as.Date(
        ifelse(day(a$date) %in% c(15:31), 
          floor_date(a$date, "month")+(3600*24*14), 
          floor_date(a$date, "month") - (3600 * 24))/(3600 * 24), 
        origin = origin)) 

:ベクトルをbasedate

    date basedate 
1 2015-02-05 07:37:12 2015-01-31 
2 2015-02-15 08:23:23 2015-02-15 
3 2015-02-24 12:03:04 2015-02-15 
4 2015-02-28 14:00:01 2015-02-15 
5 2015-03-31 11:12:13 2015-03-15 

は、行4と5で間違っている私は年代basedate 2最後は2015-02-282015-03-31になりたい私はで残りの部分を解決しました。私は私が持っているコードで別のifelseを入れ子にすることでそれを得ることができると知っていますが、確かにの簡単な方法であり、私はそれに会っていません。

日付に最も近い2週間(支払日)を正しく特定するにはどうすればよいですか? (私はbaseまたはlubridateソリューションを好むだろう。しかし、問題を処理し、他のパッケージは歓迎されている)

+0

"最後の給料日からの日数"、「最後に、あなたはpaydateと現在の日付の間の差を計算することができます最も近い給料日を各日付に合わせる " - それらの1つを決定する。 – Roland

+0

@Rolandご意見ありがとうございます。私はすでにしています: "私は支払日の日付を持つと私は単純な違いとして計算することができます"。つまり、最も近い給料日を計算する方法、残りの手数料を計算する – PavoDive

+0

最後の給料日からの日数を計算する方法があれば、私もそれを学びたいです! – PavoDive

答えて

1

lubridateを使用すると、現在の月に前14日と日後の日を示すインデックスを作成することができます。そのインデックスで、最後の給料日を見つけます。

library(lubridate) 
d <- as.Date(df$date) 
islastday <- d == (ceiling_date(d, unit="month") - 1) 
isbefore15 <- as.integer(format(df$date, '%e'))/15 < 1L 
payday <- Sys.Date() 
for(i in 1:length(d)) { 
    payday[i] <- if(islastday[i]) { 
       d[i] 
    } else if(isbefore15[i]) { 
    floor_date(d[i], unit="month") - 1L 

    } else { floor_date(d[i], unit="month") + 14L 

    } 
} 

df$payday <- payday 
df$difference <- as.Date(df$date) - df$payday 
df 
#     date  payday difference 
# 1 2015-02-05 07:37:12 2015-01-31  5 days 
# 2 2015-02-15 08:23:23 2015-02-15  0 days 
# 3 2015-02-24 12:03:04 2015-02-15  9 days 
# 4 2015-02-28 14:00:01 2015-02-28  0 days 
# 5 2015-03-31 11:12:13 2015-03-31  0 days 

更新

高速化ソリューション:

d2 <- d 
d2[isbefore15] <- floor_date(d[isbefore15], unit="month") - 1L 
d2[!isbefore15] <- floor_date(d[!isbefore15], unit="month") + 14L 
df$payday <- d2 
df$difference <- as.Date(df$date) - df$payday 
+0

あなたの答えに感謝します。私たちは同じことを達成していると思っています。ちょうど 'ifelse'と' for'を経由しました。その結果、あなたの 'payday'ベクトルも4行目と5行目に間違った日付を持ちます(記事の私の記事を参照)。彼らは2月28日と3月31日でなければなりませんでした(月の実際の最終日で** **給料日です)。正しい違いは 'c(4、0、9、0、0)' – PavoDive

+0

の回答が早すぎます。インデックスを調整することができます –

+0

詳細を教えてください?どうすれば調整できますか? – PavoDive

関連する問題