【问题标题】:Removing variables based on average of a time series in R基于R中时间序列的平均值删除变量
【发布时间】:2024-01-04 12:15:01
【问题描述】:

我在 R 中有一个时间序列(在示例数据框中,我创建了 1 到 5 秒;实际上它从 -2 到 20 秒)。对于这些时间中的每一个,我都有一个变量的值(在示例 SD1 和 SD2 中;实际上我有 49 个值系列)。我想识别从 2 秒到 4 秒的平均值为 - 5 的所有变量。一旦它们被识别出来,我想从数据集中删除这些值,但保持时间序列的其余部分完好无损。

示例数据框

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

所以我最终会得到这样的结果:

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

感谢有关此问题的所有反馈!

【问题讨论】:

  • 您好,以下不清楚:“和 > - 5 从时间 2 秒到时间 4 秒”。
  • 你想删除它们或将它们设置为NA?

标签: r time-series subset average


【解决方案1】:

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

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),1,NA)*SD2
      )
    })
  )
)

df %>%
  group_by(Participant) %>%
  mutate(SD1 = ifelse(all(abs(mean(SD1[Time >= 2 & Time <= 4])) <= 5), 1, NA) * SD1) %>%
  mutate(SD2 = ifelse(all(abs(mean(SD2[Time >= 2 & Time <= 4])) <= 5), 1, 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

【讨论】:

  • 感谢您的回复!我使用上面的代码,所以我不必写出每一对 SD,但我非常感谢你的帮助!
【解决方案2】:

我们可以为每个Participant 提取值betweenTime 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

【讨论】:

  • 感谢您的回复!这非常有效!保重!
最近更新 更多