多个过滤器参数 dplyr
Multiple filter arguments dplyr
我想在一个巨大的(>20 000 个点)数据集中过滤掉多个数据错误。
这是一个假数据集(编辑:我大大简化了它):
data<-data.table(age=c(1,1,1,2,2,2,3,3,4,4,4,4,4,4),wt=c(32,12,5,32,80,32,1,0,4,8,1,1,2,50))
在这个假设的例子中,我想在 age==1
时排除 wt
值 >20 或 <6,然后从均值中排除任何 wt
值 +/- 1 SD age
2-3 天,然后从 age
4.
的平均值中排除任何 wt
值 +/- 2 SD
编辑
请注意,我并不是要将 2-3 岁分组以提取 1 个平均值和 1 个 SD。相反,我希望 dplyr
分别提取每个年龄段(2 岁和 3 岁)的均值和标准差,并在该年龄段应用相同的排除标准。
我大体上熟悉 dplyr
并考虑过这样解决它(解决方案改编自 @Suran 的回答,但未完全按需要工作):
data_clean<-data%>%filter(
!(age==1 & wt<6),
!(age==1 & wt>20),
!(age==2 & wt >= (mean((data%>%filter(age==2))$wt) +sd((data%>%filter(age==2))$wt))),
!(age==2 & wt <= (mean((data%>%filter(age==2))$wt)-sd((data%>%filter(age==2))$wt))),
!(age==3 & wt >= (mean((data%>%filter(age==3))$wt) +sd((data%>%filter(age==3))$wt))),
!(age==3 & wt <= (mean((data%>%filter(age==3))$wt)-sd((data%>%filter(age==3))$wt))),
!(age==4 & wt >= (mean((data%>%filter(age==4))$wt) +2*sd((data%>%filter(age==4))$wt))),
!(age==4 & wt <= (mean((data%>%filter(age==4))$wt)-2*sd((data%>%filter(age==4))$wt)))
)
这是一个非常麻烦的解决方案,并且对我来说不可行,因为我实际上有 8 个不同的排除标准,跨越多个年龄段。关于如何将它们整合在一起有什么建议吗?
编辑:所需的最终数据集如下所示:
age wt
1 12
2 32
2 32
3 1
3 0
4 4
4 8
4 1
4 1
4 2
要为每个 age
获取 mean()
,您需要先 group_by(age)
和 scale()
,然后再执行过滤器参数。
data_clean <- data
group_by(age) %>%
mutate(x = abs(scale(wt)[,1])) %>% #create a new variable that scales the wt, x<=1 means wt is within 1 SD of mean, x<=2 means wt is within 2 SD of mean
ungroup() %>%
filter((age==1 & wt %in% c(6:20) | #keep weights >6g and <20g at age==1
age %in% c(2:3) & x <= 1 | #keep mean wts ± 1 SD for 2-3 days
age>=4 & x<=2) %>% #keep mean wts ± 2 SD for >=4 days
select(-x)
我想在一个巨大的(>20 000 个点)数据集中过滤掉多个数据错误。
这是一个假数据集(编辑:我大大简化了它):
data<-data.table(age=c(1,1,1,2,2,2,3,3,4,4,4,4,4,4),wt=c(32,12,5,32,80,32,1,0,4,8,1,1,2,50))
在这个假设的例子中,我想在 age==1
时排除 wt
值 >20 或 <6,然后从均值中排除任何 wt
值 +/- 1 SD age
2-3 天,然后从 age
4.
wt
值 +/- 2 SD
编辑
请注意,我并不是要将 2-3 岁分组以提取 1 个平均值和 1 个 SD。相反,我希望 dplyr
分别提取每个年龄段(2 岁和 3 岁)的均值和标准差,并在该年龄段应用相同的排除标准。
我大体上熟悉 dplyr
并考虑过这样解决它(解决方案改编自 @Suran 的回答,但未完全按需要工作):
data_clean<-data%>%filter(
!(age==1 & wt<6),
!(age==1 & wt>20),
!(age==2 & wt >= (mean((data%>%filter(age==2))$wt) +sd((data%>%filter(age==2))$wt))),
!(age==2 & wt <= (mean((data%>%filter(age==2))$wt)-sd((data%>%filter(age==2))$wt))),
!(age==3 & wt >= (mean((data%>%filter(age==3))$wt) +sd((data%>%filter(age==3))$wt))),
!(age==3 & wt <= (mean((data%>%filter(age==3))$wt)-sd((data%>%filter(age==3))$wt))),
!(age==4 & wt >= (mean((data%>%filter(age==4))$wt) +2*sd((data%>%filter(age==4))$wt))),
!(age==4 & wt <= (mean((data%>%filter(age==4))$wt)-2*sd((data%>%filter(age==4))$wt)))
)
这是一个非常麻烦的解决方案,并且对我来说不可行,因为我实际上有 8 个不同的排除标准,跨越多个年龄段。关于如何将它们整合在一起有什么建议吗?
编辑:所需的最终数据集如下所示:
age wt
1 12
2 32
2 32
3 1
3 0
4 4
4 8
4 1
4 1
4 2
要为每个 age
获取 mean()
,您需要先 group_by(age)
和 scale()
,然后再执行过滤器参数。
data_clean <- data
group_by(age) %>%
mutate(x = abs(scale(wt)[,1])) %>% #create a new variable that scales the wt, x<=1 means wt is within 1 SD of mean, x<=2 means wt is within 2 SD of mean
ungroup() %>%
filter((age==1 & wt %in% c(6:20) | #keep weights >6g and <20g at age==1
age %in% c(2:3) & x <= 1 | #keep mean wts ± 1 SD for 2-3 days
age>=4 & x<=2) %>% #keep mean wts ± 2 SD for >=4 days
select(-x)