【发布时间】:2018-10-10 20:17:57
【问题描述】:
我在使用 R data.table 进行分组和 which.max 时遇到了问题,我不确定这是否是一个错误,或者我没有正确理解 data.table 中的分组结构.我有一个解决方法,我只是想了解为什么我最初的尝试失败了。
我正在查看一个包含时间序列的表,我想获取 (a) 感兴趣事件发生的时间,或 (b) 时间序列中的最终时间戳。如果事件未发生,则列标记 events 为“NA”,如果发生,则为“1”。
这是重现问题的最小示例:
dt <- data.table(t = seq(9), event = c(NA, NA, NA, NA, 1, NA, 1, NA, NA), t_id = c(rep('A', 3), rep('B', 3), rep('C', 3)))
dt[, ifelse(is.null(which.max(event)), max(t), t[which.max(event)]), by=t_id]
这会返回
t_id V1
A NA
B 5
C 7
“A”组的值为 NA(我天真地期望它为 3)。如果我在没有 ifelse 函数的情况下运行它
dt[, t[which.max(event)], by=t_id]
“A”的行完全丢失(which.max 返回 NULL)。但是如果我运行
dt[, is.null(which.max(event)), by=t_id]
我明白了
t_id V1
A FALSE
B FALSE
C FALSE
我错过了什么?
【问题讨论】:
-
那么您究竟希望从
is.null(which.max(event))得到什么?你见过which.max返回NULL吗?如果我是你,我会首先尝试从内到外调试。例如,值得检查您从is.null(which.max(NA))获得的信息。解决这个问题的一种方法是dt[, if(all(is.na(event))) max(t) else t[which.max(event)], by = t_id] -
它不是 NULL,但它不是我能识别的其他任何东西——类是“整数”,而且我看不到恢复值的方法,而且 is.nan(which.max( NA)) 和 is.na(which.max(NA)) 返回没有值的逻辑。
-
您可以使用
all(is.na(event))。并且,不惜一切代价,尽量避免ifelse在不必要的时候(比如这种情况) -
一般情况下,当你想每组选择一行时,你可以排序然后使用
unique,我猜在这种情况下......unique(dt[order(t_id, !is.na(event), t)], by="t_id", fromLast=TRUE)?顺便说一句,您应该只使用 TRUE/FALSE 记录事件发生,而不是非标准的 1/NA,因为大多数 R 语法都可以很好地使用前者。 -
@Frank,我实际上提供了比我仍在使用 ifelse 的解决方法更清洁的解决方案。我的应用程序有 NA 和 0 表示没有事件,这就是我使用 max 的原因。
标签: r data.table