【发布时间】:2017-08-16 11:04:27
【问题描述】:
我正在尝试使用 lapply 跨行查找 data.table 的最大日期。我有一些行,其中行中的所有值都是NA,在这种情况下,我想返回一个特定的日期。我编写了一个函数来执行此操作,但没有得到预期的结果。
library(data.table)
my.max = function(x){
if(all(is.na(x))){
return(as.Date("9999-12-01")) #we can use this to identify which BPIDs have no end date
}else{
return(max(x, na.rm = T))
}
}
DT = data.table("Date1" = c(as.Date("2015-12-30"),NA, NA), "Date2" = c(as.Date("2013-02-04"), as.Date("2014-01-01"), NA))
DT[ , "Row" := 1:.N]
DT[ , "Max_Date" := lapply(.SD, my.max), by = .(Row), .SDcols = c("Date1", "Date2")]
返回
> DT
Date1 Date2 Row Max_Date
1: 2015-12-30 2013-02-04 1 2015-12-30
2: <NA> 2014-01-01 2 9999-12-01
3: <NA> <NA> 3 9999-12-01
因此,如果所有值都是NA,它确实有效,但如果其中一个值是NA,它也会返回9999-12-01。我将打印函数放入my.max 以了解发生了什么,看起来它一次传入一个 x 值。这解释了为什么 all(is.na(x)) 会是真的,但我希望它会传入行中两个日期的向量。否则,它怎么知道取最大值的值是多少?
如何更改我的函数,使其仅在其他两个日期均为 NA 时才返回 9999-12-01?
【问题讨论】:
标签: r data.table lapply