2016-05-07 6 views
0

日付の列を持つdata.tableがあります。元の日付が日付の前か後かに基づいて1年または2年を追加する新しい列を作成する必要があります。Rのデータテーブルで条件付き代入を実行するときの潤滑形式のエラー

以下の結果が得られます。 lubridateは日付に変換できません。私はステートメントをmdyでラップしようとしましたが、これはうまくいきません。割り当て文をTRUE/FALSEに置き換えると、値が正しく割り当てられるため、条件文が機能していることがわかります。

> data 
    name  paid change_date 
1: A 2016-05-30 1527638400 
2: B 2016-06-30 1498780800 
3: C 2016-07-30 1501372800 
> str(data) 
Classes ‘data.table’ and 'data.frame': 3 obs. of 3 variables: 
$ name  : chr "A" "B" "C" 
$ paid  : POSIXct, format: "2016-05-30" "2016-06-30" "2016-07-30" 
$ change_date: num 1.53e+09 1.50e+09 1.50e+09 
- attr(*, ".internal.selfref")=<externalptr> 

答えて

2

問題はifelseストリップ属性ということであり、従って、日付の書式を(参照:?ifelse)を除去します。日付の書式のバックを取得するには、origin = '1970-01-01'as.Dateであなたのifelse文をラップすることができます:

data[, change_date := as.Date(ifelse(paid + years(1) < new_release, 
            paid + years(2), 
            paid + years(1)), 
           origin = '1970-01-01')] 

与える:

> data 
    name  paid change_date 
1: A 2016-05-30 2018-05-30 
2: B 2016-06-30 2017-06-30 
3: C 2016-07-30 2017-07-30 

以上にpaid列のクラスを割り当てることで、後でそれを修正しますchange_date列:

data[, change_date := ifelse(paid + years(1) < new_release, 
          paid + years(2), 
          paid + years(1))] 
class(data$change_date) <- class(data$paid) 

これは同じ結果をもたらします。


(まだlubridateを使用して)同じことを実現しifelseための代替:

data[, change_date := paid + years(as.numeric((paid + years(1) < new_release) + 1))] 

は与える:

> data 
    name  paid change_date 
1: A 2016-05-30 2018-05-30 
2: B 2016-06-30 2017-06-30 
3: C 2016-07-30 2017-07-30 
3

を私はちょうどlubdridate残し、基本的な日でそれをすべて行いますタイプ:

library(data.table) 

name <- c("A", "B", "C") 
paid <- as.Date(c("2016-05-30", "2016-06-30", "2016-07-30")) 
data <- data.table(name,paid) 

new_release <- as.Date("2017-06-01") 
year <- 365.25 

data[, change_date:= as.Date(ifelse(paid + year < new_release, 
            paid + year*2, 
            paid + year)) ] 
その後

R> data[] 
    name  paid change_date 
1: A 2016-05-30 2018-05-30 
2: B 2016-06-30 2017-06-30 
3: C 2016-07-30 2017-07-30 
R> 

しかしifelse()data.tableの文脈で奇妙な感じ。代わりの方法は次のとおりです。

R> data[, cdate := paid+year ]        # baseline 
R> data[paid + year < new_release, cdate := paid + 2*year] # 
R> data[] 
    name  paid change_date  cdate 
1: A 2016-05-30 2018-05-30 2018-05-30 
2: B 2016-06-30 2017-06-30 2017-06-30 
3: C 2016-07-30 2017-07-30 2017-07-30 
R> 
関連する問題