R:当与data.table一起使用时,函数会改变其输出的长度

时间:2018-06-13 20:29:35

标签: r data.table user-defined-functions

我遇到的问题是,在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.但不知何故,它似​​乎会占用列长度。

(这个例子的构造只是为了显示我在一个更大的函数中存在的问题)

非常感谢。

1 个答案:

答案 0 :(得分:0)

正如Roman所建议的那样,您可以使用by来获得所需的输出:

dt2[, tmp := length( tmp.f(Date.v = Date)), by = Date ]

lengthsummax等函数将向量作为输入但返回单个值。您的示例中发生的情况是,您的列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