Pet*_*hen 5 if-statement r date data.table
这是我的数据:
BuyDate SellDate Number
2015-01-01 NA 1
2015-01-01 2015-01-03 1
2015-01-01 2015-01-03 -1
2016-12-09 NA -1
Run Code Online (Sandbox Code Playgroud)
我想创建一个新列Start,所以我可以得到以下结果.
BuyDate SellDate Number Start
2015-01-01 NA 1 2015-01-01
2015-01-01 2015-01-03 1 2015-01-01
2015-01-01 2015-01-03 -1 2015-01-03
2016-12-09 NA -1 2016-12-09
Run Code Online (Sandbox Code Playgroud)
代码是:
data[,Start:=ifelse(Number=="1",BuyDate,ifelse(is.na(SellDate),BuyDate,SellDate))]
Run Code Online (Sandbox Code Playgroud)
但是,我得到:
BuyDate SellDate Number Start
2015-01-01 NA 1 1420070400
2015-01-01 2015-01-03 1 1420070400
2015-01-01 2015-01-03 -1 1420243200
2016-12-09 NA -1 1481241600
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
str(data)
Classes ‘data.table’ and 'data.frame':
$BuyDate : POSIXct, format: "2015-01-01" "2015-01-01" "2015-01-01" "2016-12-09"
$SellDate: POSIXct, format: NA "2015-01-03" "2015-01-03" NA
$Number : chr "1" "1" "-1" "-1"
Run Code Online (Sandbox Code Playgroud)
最好不要使用,ifelse因为'Date'可以被强制转换为integer存储值,相反,我们将(:='Start)指定为'SellDate',然后在'i'中指定逻辑条件以识别'NA'元素'开始'或'数字'中的1并指定(:=)'BuyDate'中与'i'对应''开头'的元素
data[, Start := SellDate][Number==1, Start := BuyDate
][is.na(Start), Start := BuyDate][]
Run Code Online (Sandbox Code Playgroud)
正如@Cath在评论中提到的,这可以分两步完成
data[, Start := SellDate][(Number==1) | is.na(Start), Start := BuyDate][]
Run Code Online (Sandbox Code Playgroud)