gpt4 book ai didi

r - 使用 by-operator : functions that return numeric values and/or NAs fail 拆分 data.table

转载 作者:行者123 更新时间:2023-12-04 02:08:19 25 4
gpt4 key购买 nike

我有一个 data.table有两列:一 ID列一value柱子。我想按 ID 拆分表格列并运行函数 foovalue柱子。只要 foo 就可以正常工作不返回 NA。在这种情况下,我收到一个错误,告诉我组的类型不一致。我的假设是 - 因为 is.logical(NA)等于 TRUEis.numeric(NA)等于 FALSE , data.table内部假设我想将逻辑值与数字值组合并返回错误。但是,我发现这种行为很奇怪。对此有何评论?我是否错过了一些明显的东西,或者这确实是有意的行为?如果是这样,简短的解释会很好。 (请注意,我确实知道一种解决方法:只需让 foo2 返回一个完整的不可能的数字并稍后对其进行过滤。但是,这似乎是错误的编码)。

这是示例:

library(data.table)
foo1 <- function(x) {if (mean(x) < 5) {return(1)} else {return(2)}}
foo2 <- function(x) {if (mean(x) < 5) {return(1)} else {return(NA)}}
DT <- data.table(ID=rep(c("A", "B"), each=5), value=1:10)
DT[, foo1(value), by=ID] #Works perfectly
ID V1
[1,] A 1
[2,] B 2
DT[, foo2(value), by=ID] #Throws error
Error in `[.data.table`(DT, , foo2(value), by = ID) :
columns of j don't evaluate to consistent types for each group: result for group 2 has column 1 type 'logical' but expecting type 'numeric'

最佳答案

您可以通过指定您的函数应返回 NA_real_ 来解决此问题。 ,而不是 NA默认类型。

foo2 <- function(x) {if (mean(x) < 5) {return(1)} else {return(NA)}}
DT[, foo2(value), by=ID] #Throws error
# Error in `[.data.table`(DT, , foo2(value), by = ID) :
# columns of j don't evaluate to consistent types for each group:
# result for group 2 has column 1 type 'logical' but expecting type 'numeric'

foo3 <- function(x) {if (mean(x) < 5) {return(1)} else {return(NA_real_)}}
DT[, foo3(value), by=ID] #Works
# ID V1
# [1,] A 1
# [2,] B NA

顺便留言说 foo2()当它失败时给出是很好的信息。它基本上告诉你你的 NA 是错误的类型。要解决此问题,您只需查找 NA正确类型(或类)的常量:
NAs <- list(NA, NA_integer_, NA_real_, NA_character_, NA_complex_)
data.frame(contantName = sapply(NAs, deparse),
class = sapply(NAs, class),
type = sapply(NAs, typeof))

# contantName class type
# 1 NA logical logical
# 2 NA_integer_ integer integer
# 3 NA_real_ numeric double
# 4 NA_character_ character character
# 5 NA_complex_ complex complex

关于r - 使用 by-operator : functions that return numeric values and/or NAs fail 拆分 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7960798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com