data.table不同时接受'by'和'format'(日期)

时间:2016-10-13 02:54:21

标签: r data.table

我正在使用data.table来查找“会话”的平均日期,但我在尝试按照我想要的方式进行格式化时遇到了麻烦,我对这个问题感到困惑:

library( data.table )
data <- data.table( session = c( 1,1,1,1,2,2,2,2,2,2,3,3,3,3 ),
                    date = as.Date( c( "2016-01-01", "2016-01-02", "2016-01-03", "2016-01-03",
                                       "2016-04-30", "2016-04-30", "2016-05-03", "2016-05-03", "2016-05-03", "2016-05-03",
                                       "2016-08-28", "2016-08-28", "2016-08-28", "2016-08-28" ) )
)

我想要的是根据会话的时间给每个会话一个标签。我决定将每个会话标记为会话发生的月份(格式为“%b-%Y”),但由于会话有时跨越2个月,我想通过取平均日期来做到这一点会话,并使用它来决定标签。

我可以使用by参数找到每个会话的平均日期:

output <- copy( data )[ , Month := mean( date ), by = session ]

我还可以在data.table内以我想要的方式重新格式化平均日期:

output <- copy( data )[ , Month := format( mean( date ), "%b-%Y" ) ]

但我不能同时做到这两点:

output <- copy( data )[ , Month := format( mean( date ), "%b-%Y" ), by = session ]

以上内容会返回错误:

Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L,  : 
invalid 'trim' argument
In addition: Warning message:
In mean(date) : argument is not numeric or logical: returning NA

我在这里做错了什么?代码看起来对我来说,每个部分工作正常,为什么这不起作用?

注意我可以通过两个步骤(下面)完成我需要的工作,并且工作正常,但我很想知道它是什么,我很想念。上面的代码出了点问题,我只是看不出它是什么:

output <- copy( data )[ , Month := mean( date ), by = session 
                        ][ , Month := format( Month, "%b-%Y" ) ]

1 个答案:

答案 0 :(得分:3)

如果您使用mean.Date代替mean

,则可以使用
output <- copy( data )[ , Month := format( mean.Date( date ), format="%b-%Y" ), by = session ]

这样就利用了format.Date