【发布时间】:2016-11-01 23:49:15
【问题描述】:
我有一个看起来像这样的数据框:
time id trialNum trialType accX gravX
1 1 6 7 low -0.38876217 10.185266
2 2 1 6 low 0.68254705 10.741545
3 3 3 15 high -0.21906854 9.466929
4 4 2 15 none -0.03370001 9.490829
5 5 4 1 high 0.16511542 10.986796
6 6 9 2 none -0.10441621 9.915561
你可以使用这个来生成类似的东西:
testDF <- data.frame(time = 1:50,
id = sample(1:10, size=50, replace=T),
trialNum = sample(1:15, size = 50, replace=T),
trialType = sample(c("none", "low", "high"),
size = 50, replace=T),
accX = sin(seq(1,50,1)),
gravX = 0.1)
还有一个函数来计算滤波信号中峰值之间的平均时间(返回平均时间和时间差的方差):
library(dplyr)
library(signal)
library(quantmod)
calcStepTime <- function(df){
bf <- butter(1, c(0.03,0.05), type="pass")
filtered <- filtfilt(bf, df$accX - df$gravX)
peaks <- findPeaks(filtered)
peakValue <- filtered[peaks]
peakTime <- df$time[peaks]
timeDifferences <- diff(peakTime)
meanStepTime <- mean(timeDifferences)
varianceStepTime <- var(timeDifferences)
return(c(meanStepTime, varianceStepTime))
}
我正在尝试使用groupby 将此函数应用于id、trialNum 和trialType 的每个组合:
tempTrial <-
group_by(testDF, id, trialNum, trialType) %>%
summarise(meanTime = calcStepTime(.)[1],
varianceTime= calcStepTime(.)[2])
问题在于,在输出数据帧 (tempTrial) 中,meanTime 和 varianceTime 的每一行都是相同的
在这个玩具数据集中,有时列都显示NA(这在我的实际数据集中不会发生)
我是否做错了什么导致两列的每一行都相同?它应该采用id、trialNum 和trialType 的每个组合,并分别计算每个组合的峰值时间。但是,它似乎只为每个组合存储一个值?
【问题讨论】:
-
我收到一个错误。
Error: could not find function "butter"请提供库名称。 -
这里,
findPeaks(filtered)返回numeric(0) -
您正在通过几个变量对一个相对较小的数据框进行分组,这意味着您的“分组”数据框可能与您的原始数据框大小相同(或接近)。如果是这样,每组都是一行长,不可能在一行中找到一个峰值。
-
我已经调整了上面的 testDF 代码,因此它不再通过生成正弦波来生成 NA。这应该可以解决
numeric(0)问题。我知道测试数据很小,但我的实际数据大约是 100,000 行,所以其他地方肯定有问题,因为无论样本大小如何,我在每一行中都得到相同的数字 -
小团体的问题在总结中仅次于
.的使用问题。虽然修复小组或防御性编码以使其不再生成NA或NaN是值得的,但除非您意识到summarise和@987654344 的组合,否则问题不会得到解决@ 是问题所在。
标签: r filtering dplyr signal-processing