使用data.table包,哪一个将提供最快的用户时间?(R)程序编制
我在一次在线培训的测试中遇到了这个问题。我只是通过反复试验才弄对了。很可能,我做错了什么,因为我是R编程的初学者 问题是: 在阅读我的R代码之前,请注意,对于最后一部分,我必须将所有列转换为数字,因为如果没有转换,我将得到以下消息: “行平均值(DT)中的错误:'x'必须是数字。” 在测试中,我的教授解决方案是:“DT[,mean(pwgtp15),by=SEX]” 对于我的R代码,正确的答案是平均值(DT$pwgtp15,by=DT$SEX) 我得到这个输出: 我的疑问是,也许我的做功方法DT[,mean(pwgtp15),by=SEX]产生的计算速度很慢 为此,我使用了使用data.table包,哪一个将提供最快的用户时间?(R)程序编制,r,R,我在一次在线培训的测试中遇到了这个问题。我只是通过反复试验才弄对了。很可能,我做错了什么,因为我是R编程的初学者 问题是: 在阅读我的R代码之前,请注意,对于最后一部分,我必须将所有列转换为数字,因为如果没有转换,我将得到以下消息: “行平均值(DT)中的错误:'x'必须是数字。” 在测试中,我的教授解决方案是:“DT[,mean(pwgtp15),by=SEX]” 对于我的R代码,正确的答案是平均值(DT$pwgtp15,by=DT$SEX) 我得到这个输出: 我的疑问是,也许我的做功方法
DT <- data.frame(data.matrix(DT))
DT如前所述,问题的答案选择不会产生相同的结果。“收件人”没有指定的参数。由于该函数允许向其他方法传递或从其他方法传递更多参数,因此它不会按参数出错。因此,由于它不会按DT$SEX
等因素进行分割/子集,因此它将是最快的时间
此外,还有其他方法返回较慢时间的原因:
tapply(…)
,sapply(split(…)
,rowMeans(…)
所有都是直接或间接应用族成员,这些族成员都是不完全矢量化的计算。另外,row意味着
是apply
的包装器,被调用两次。另外,apply
以将整个数据帧/表投射到矩阵而闻名,我们应该注意:
如果您正在使用data.frame
s,请忘记有一个名为apply
的函数-无论您做什么-不要使用它。特别是边距为1时(此函数的唯一良好用途是在矩阵
列上操作-边距为2)
平均值(…);平均值(…)
这会对子集数据帧进行两次调用。使用[
的逻辑索引返回数据帧的所有列,然后$
为mean()
选择最后的数字列
事实上,如果运行返回所有列的向量子集而不是数据帧子集,则速度会快得多,并且可能是最快的:
mean(DT$pwgtp15[DT$SEX==1]);mean(DT$pwgtp15[DT$SEX==2])
a <- Sys.time()
DT[,mean(pwgtp15), by=SEX]
b <- Sys.time()
myTime <- b-a
myTime
# Time difference of 0.01888704 secs
# Time difference of 0.03294992 secs
# Time difference of 0.03321409 secs
a <- Sys.time()
mean(DT$pwgtp15[DT$SEX==1]);mean(DT$pwgtp15[DT$SEX==2])
b <- Sys.time()
myTime <- b-a
myTime
# Time difference of 0.006003857 secs
# Time difference of 0 secs
# Time difference of 0 secs
平均值(DT$pwgtp15[DT$SEX==1]);平均值(DT$pwgtp15[DT$SEX==2])
一个Hmmmm…我不能让mean(…,by=…)
除了显示一个mean
值之外还能工作。by参数被完全忽略。文档也不显示。请显示packageVersion(“data.table”)
@Parfait谢谢你的帮助!你使用了吗?是的,返回mean(DT$pwgtp15,by=DT$SEX)
是一个单独的值,与其他按性别划分的值不同。不必考虑时间。您正在测试的所有方法都应该自己返回相同的输出。mean()
没有。by参数被忽略。这正是它之所以更快的原因,因为它不进行分割和计算。实际上,即使是rowMeans
对我来说也是错误的。顺便说一句-聚合(pwgtp15~ SEX,DT,mean)
与DT[…]竞争
call!明白了。就学到的知识联系你的教授!愉快的编码!太好了!非常感谢!我现在有了更好的理解。结论是这个问题问得不恰当。或者,教授这样做是为了让我们更加努力:)
mean(DT$pwgtp15[DT$SEX==1]);mean(DT$pwgtp15[DT$SEX==2])
a <- Sys.time()
DT[,mean(pwgtp15), by=SEX]
b <- Sys.time()
myTime <- b-a
myTime
# Time difference of 0.01888704 secs
# Time difference of 0.03294992 secs
# Time difference of 0.03321409 secs
a <- Sys.time()
mean(DT$pwgtp15[DT$SEX==1]);mean(DT$pwgtp15[DT$SEX==2])
b <- Sys.time()
myTime <- b-a
myTime
# Time difference of 0.006003857 secs
# Time difference of 0 secs
# Time difference of 0 secs