使用滚动平均值,随着时间的推移以及两个不同的条件

时间:2016-02-12 05:21:14

标签: r

数据结构

我的数据(较宽数据集的一小部分样本)的结构如下:

Individ <- data.frame(Participant = c("Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", "Bill", 
                                      "Harry", "Harry", "Harry", "Harry","Harry", "Harry", "Harry", "Harry", "Paul", "Paul", "Paul", "Paul"),
                      Time = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4),
                      Condition = c("Placebo", "Placebo", "Placebo", "Placebo", "Expr", "Expr", "Expr", "Expr", "Expr", "Expr", "Expr", "Expr", 
                                    "Placebo", "Placebo", "Placebo", "Placebo", "Expr", "Expr", "Expr", "Expr", "Expr", "Expr", "Expr", "Expr"),
                      Location = c("Home", "Home", "Home", "Home", "Away", "Away", "Away", "Away", "Home", "Home", "Home", "Home", 
                                   "Home", "Home", "Home", "Home", "Away", "Away", "Away", "Away", "Home", "Home", "Home", "Home"),
                      Power = c(400, 250, 180, 500, 300, 450, 600, 512, 300, 500, 450, 200, 402, 210, 130, 520, 310, 451, 608, 582, 390, 570, NA, NA))

我的问题

我希望量化以下内容:

  • 在2,3和4秒窗口内滚动平均值Power
  • ParticipantCondition的每个(单独)组合下的每个Location计算上述内容。例如,在安慰剂Power和首页Condition期间计算比尔的Location的2秒滚动平均值。重复此操作并计算3和4秒滚动平均值的功率。再次重复Expr和离开ConditionLocation
  • 在每个PowerCondition下找到每个滚动平均值(2,3和4秒窗口)Location的最高5%。例如,在安慰剂Condition和首页Location下,在比尔的2秒滚动平均值中找到最高5%。重复此操作3和4秒滚动平均值。再次重复Expr和离开ConditionLocation
  • 我如何处理NA

我所尝试的内容

我可以针对不同的ParticipantCondition下的每个Location进行计算,方法是单独调出它们。例如:

require(zoo)
# Call out all the data for "Bill"
my.data.frame <- Individ[(Individ$Participant == "Bill"), ]
# Call out data for "Placebo" condition only
my.data.frame <- my.data.frame[(my.data.frame$Condition == "Placebo"), ]
# Iterate over the "Power" column and compute a 2, 3 and 4 sec rolling average
my.data.frame$TwoSec <- rollapply(my.data.frame[, 5], width = 2, function(...) {round(mean(...), digits = 1)}, partial = TRUE)
my.data.frame$ThreeSec <- rollapply(my.data.frame[, 5], width = 3, function(...) {round(mean(...), digits = 1)}, partial = TRUE)
my.data.frame$FourSec <- rollapply(my.data.frame[, 5], width = 4, function(...) {round(mean(...), digits = 1)}, partial = TRUE)

然而,这是时间密集且劳动密集的。另外,我坚持如何计算前5%。

约束

我的实际数据集是3,062,143 obs。在这些不同的条件下有超过50名参与者。收集Time的{​​{1}}是&gt; 900秒(因此需要滚动平均值)。理想情况下,快速且计算量不高的解决方案将是理想的。

我知道这是一个由许多较小部分组成的冗长问题。如果我需要进一步澄清,或者将这个问题分解为几个单独的问题,请告诉我。谢谢。

1 个答案:

答案 0 :(得分:0)

此帖子将根据OP可能的说明进行编辑:

如果您要求的最长时间仅为1,2,3秒:

这可能不是最好的方法,但它应该有用。

第1步:过滤器仅设置为1,2和3

library(dplyr)
Individ1 <- Individ %>% filter( Time == 1 | Time == 2 | Time == 3) %>% select ( Participant, Time, Condition, Location, Power)

library(dplyr)
Individ1 <- Individ %>% filter( Time <= 3) %>% select ( Participant, Time, Condition, Location, Power)

我不确定时间是否属于绝对,所以请根据自己的内容进行修改。

第2步:按权力排序

Individ2 <- Individ1[order(-Individ1$Power),] 

第3步:计算前5%数据中的观察量

top_percentile <-ceiling(nrow(Individ2)*.05)

步骤4:仅选择所述数据集中的第一个“top_percentile”观察结果。

Individ3<- Individ2[1:top_percentile,]

第5步:按条件,位置排序

Indvivid4<- Individ3[order(Individ3$Condition, Individ3$Location),]

我只创建了新的数据框,以便向您展示如果您希望在r环境中完成数据集,每个步骤如何更改数据集。如果您只想要一个数据框,只需删除这些数字。

如果这不是您的要求,请详细说明。我可能误解了你。