根据R中时间序列的平均值删除变量

问题描述

我在R中有一个时间序列(在示例数据帧中,我创建了1到5秒;实际上,它是从2到20秒)。对于这些时间中的每一次,我都有一个变量值(在示例SD1和SD2中;实际上,我有一系列49个值)。我想确定从时间2秒到时间4秒的所有平均值均-5的变量。一旦确定了它们,我想从数据集中删除这些值,但保持其余时间序列不变。

示例数据框

df1 <- data.frame(Participant = c('A','A','B','C','C' ),Time = c(1,2,3,4,5,1,5),SD1 = c(-10,-10,50,1),SD2 = c(0,50))

所以我最终会得到这样的东西:

df2 <- data.frame(Participant = c('A',SD1 = c(NA,NA,SD2 = c(NA,50))

感谢您对此问题的所有反馈!

解决方法

我们可以为每个between提取值Time Participant 2秒和4秒,然后计算它们的mean。如果均值大于5,则将值替换为NA。我们可以使用across将函数应用于多列。

library(dplyr)

df %>%
  group_by(Participant) %>%
  mutate(across(SD1:SD2,~if(abs(mean(.[between(Time,2,4)])) > 5) NA else .))

#   Participant  Time   SD1   SD2
#   <chr>       <dbl> <dbl> <dbl>
# 1 A               1    NA    NA
# 2 A               2    NA    NA
# 3 A               3    NA    NA
# 4 A               4    NA    NA
# 5 A               5    NA    NA
# 6 B               1    NA     0
# 7 B               2    NA     0
# 8 B               3    NA     0
# 9 B               4    NA     1
#10 B               5    NA    50
#11 C               1     1     0
#12 C               2     1     0
#13 C               3     1     0
#14 C               4     1     1
#15 C               5     1    50
,

我不确定以下代码是否适合您

do.call(
  rbind,c(
    make.row.names = FALSE,lapply(split(df,df$Participant),function(v) {
      transform(v,SD1 = ifelse(all(abs(mean(SD1[Time >= 2 & Time <= 4])) <= 5),1,NA)*SD1,SD2 = ifelse(all(abs(mean(SD2[Time >= 2 & Time <= 4])) <= 5),NA)*SD2
      )
    })
  )
)

df %>%
  group_by(Participant) %>%
  mutate(SD1 = ifelse(all(abs(mean(SD1[Time >= 2 & Time <= 4])) <= 5),NA) * SD1) %>%
  mutate(SD2 = ifelse(all(abs(mean(SD2[Time >= 2 & Time <= 4])) <= 5),NA) * SD2)

都在给

   Participant Time SD1 SD2
1            A    1  NA  NA
2            A    2  NA  NA
3            A    3  NA  NA
4            A    4  NA  NA
5            A    5  NA  NA
6            B    1  NA   0
7            B    2  NA   0
8            B    3  NA   0
9            B    4  NA   1
10           B    5  NA  50
11           C    1   1   0
12           C    2   1   0
13           C    3   1   0
14           C    4   1   1
15           C    5   1  50