我遇到的问题是,在data.table中使用用户定义的函数会改变函数输出。我构建了一个具有相同问题的简单版本:
library(data.table)
tmp.f <- function(Date.v){var.v <- Date.v }
dt1 <- data.table( Date = c("2018-05-15","2018-05-16") )
dt1[, tmp := length( tmp.f(Date.v = Date)) ]
dt2 <- data.table( Date = c("2018-05-14","2018-05-15","2018-05-16") )
dt2[, tmp := length( tmp.f(Date.v = Date)) ]
dt1
# Date tmp
#1: 2018-05-15 2
#2: 2018-05-16 2
dt2
# Date tmp
#1: 2018-05-14 3
#2: 2018-05-15 3
#3: 2018-05-16 3
我需要该函数简单地从data.table中的Date列中选取相应的日期并计算相应的值(在此示例中为相同的日期)。函数输出的长度应始终为1.但不知何故,它似乎会占用列长度。
(这个例子的构造只是为了显示我在一个更大的函数中存在的问题)
非常感谢。
答案 0 :(得分:0)
正如Roman所建议的那样,您可以使用by
来获得所需的输出:
dt2[, tmp := length( tmp.f(Date.v = Date)), by = Date ]
length
,sum
或max
等函数将向量作为输入但返回单个值。您的示例中发生的情况是,您的列Date
完全传递给tmp.f
,然后传递给length
,它将输出3作为单个值。然后将其回收以填充tmp
列,给人的印象是每行计算length( tmp.f(Date.v = Date))
,而它只计算过一次。
使用by
与否将主要取决于您应用的函数是否自然地向量化(或者在cumsum
的情况下,输出相同长度的向量):
dt2[, tmp := as.Date(Date) + 10] # works as expected because function(x){as.Date(x)+10}
# is naturally vectorized