Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用data.table包,哪一个将提供最快的用户时间?(R)程序编制_R - Fatal编程技术网

使用data.table包,哪一个将提供最快的用户时间?(R)程序编制

使用data.table包,哪一个将提供最快的用户时间?(R)程序编制,r,R,我在一次在线培训的测试中遇到了这个问题。我只是通过反复试验才弄对了。很可能,我做错了什么,因为我是R编程的初学者 问题是: 在阅读我的R代码之前,请注意,对于最后一部分,我必须将所有列转换为数字,因为如果没有转换,我将得到以下消息: “行平均值(DT)中的错误:'x'必须是数字。” 在测试中,我的教授解决方案是:“DT[,mean(pwgtp15),by=SEX]” 对于我的R代码,正确的答案是平均值(DT$pwgtp15,by=DT$SEX) 我得到这个输出: 我的疑问是,也许我的做功方法

我在一次在线培训的测试中遇到了这个问题。我只是通过反复试验才弄对了。很可能,我做错了什么,因为我是R编程的初学者

问题是:

在阅读我的R代码之前,请注意,对于最后一部分,我必须将所有列转换为数字,因为如果没有转换,我将得到以下消息:

“行平均值(DT)中的错误:'x'必须是数字。”

在测试中,我的教授解决方案是:“DT[,mean(pwgtp15),by=SEX]

对于我的R代码,正确的答案是平均值(DT$pwgtp15,by=DT$SEX)

我得到这个输出:

我的疑问是,也许我的做功方法DT[,mean(pwgtp15),by=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