ifelse with data.table

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)

akr*_*run 5

最好不要使用,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)

  • 为什么不只是`data [,Start:= SellDate] [(Number == 1)| is.na(开始),开始:= BuyDate] []`? (5认同)
  • 你能解释一下你的答案吗,我认为它很好,但我不能完全理解它. (2认同)
  • @Cath Minor plus可能是自动索引,特别是在https://github.com/Rdatatable/data.table/issues/1068之后再次,在https://github.com/Rdatatable/data.table/issues/1453之后方式也用它. (2认同)