数据结构
我的数据(较宽数据集的一小部分样本)的结构如下:
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))
我的问题
我希望量化以下内容:
Power
。Participant
和Condition
的每个(单独)组合下的每个Location
计算上述内容。例如,在安慰剂Power
和首页Condition
期间计算比尔的Location
的2秒滚动平均值。重复此操作并计算3和4秒滚动平均值的功率。再次重复Expr和离开Condition
加Location
。Power
和Condition
下找到每个滚动平均值(2,3和4秒窗口)Location
的最高5%。例如,在安慰剂Condition
和首页Location
下,在比尔的2秒滚动平均值中找到最高5%。重复此操作3和4秒滚动平均值。再次重复Expr和离开Condition
加Location
。NA
?我所尝试的内容
我可以针对不同的Participant
和Condition
下的每个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秒(因此需要滚动平均值)。理想情况下,快速且计算量不高的解决方案将是理想的。
我知道这是一个由许多较小部分组成的冗长问题。如果我需要进一步澄清,或者将这个问题分解为几个单独的问题,请告诉我。谢谢。
答案 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环境中完成数据集,每个步骤如何更改数据集。如果您只想要一个数据框,只需删除这些数字。
如果这不是您的要求,请详细说明。我可能误解了你。