问题描述
我在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