【问题标题】:Do I have this equivalency for data.table and ddply right?我对 data.table 和 ddply 有这种等效性吗?
【发布时间】:2014-07-18 22:30:10
【问题描述】:

示例:过滤信号或序列(输出行数与输入相同)

library(data.table)
library(plyr)
dummy.table <- data.table(val=runif(30),group1=rep(1:2,times=15),group2 = rep(1:15,each=2))


library(signal)
end.f <- 20
start.f <- 10
sample.rate <- 256
low.pass <- butter(buttord(Wp = start.f/sample.rate*2,
                       Ws = end.f/sample.rate*2,
                       Rp = 0.5, Rs = 40))

鉴于上述数据,我该如何修复ddply 调用?不管我用summarize还是mutate,输出的行数都不一样。

dummy.table[,val:=filtfilt(low.pass,val), by=c("group1","group2")]

filt.test <- ddply(dummy.table, .(group1, group2),
               mutate,
               val=filtfilt(filt=low.pass,x=dummy.table$val))

【问题讨论】:

  • 您确定dummy.table.filt 会存在吗?我知道 hadley 在评估机制方面做了一些奇怪的事情,但我怀疑你从其他一些 OOP 语言中引入了一些语言约定。
  • 一般来说mutate不应该改变行数。
  • @BondedDust 抱歉,这是制作 MWE 时的代码拼写错误。

标签: r data.table plyr


【解决方案1】:

您并没有说您是否遇到错误。 dummy.table.file$ 看起来都错了,我认为 ddply 可能会使 val 在评估环境中可用。这运行没有错误。:

 filt.test <- ddply(dummy.table, .(group1, group2),
                mutate,
                val=filtfilt(filt=low.pass,x=val))
#--------------
 str(filt.test)
'data.frame':   30 obs. of  3 variables:
 $ val   : num  0.000239 0.000425 0.000416 0.000402 0.000225 ...
 $ group1: int  1 1 1 1 1 1 1 1 1 1 ...
 $ group2: int  1 2 3 4 5 6 7 8 9 10 ...

我想知道使用summarise 而不是mutate 是否会更好,但看起来我得到了相同的结果。我还怀疑您没有获得 data.table 效率。不过,dplyr 包可能会改善这一点。

【讨论】:

  • 您认为 data.table 调用的问题在哪里?不幸的是,过滤功能是 Octave 的直接端口(根据文档),因此它们可能没有被优化。
猜你喜欢
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2010-12-12
相关资源
最近更新 更多