【发布时间】:2021-03-22 09:45:09
【问题描述】:
我想在一个巨大的(>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 或age 2-3 天的平均值中排除任何wt 值+/- 1 SD,然后从age 4 的平均值中排除任何wt 值+/- 2 SD。
编辑
请注意,我并没有尝试将 2-3 岁分组以提取 1 个均值和 1 个 SD。相反,我希望 dplyr 分别提取每个年龄(2 岁和 3 岁)的平均值和 SD,并在该年龄范围内应用相同的排除标准。
我通常熟悉 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
【问题讨论】:
-
您可以在过滤序列中使用多个过滤管道。因此,只需逐步实现您的过滤器序列即可获得清晰度
-
@SteveM 我已经更新了我的问题以澄清事情。
标签: r filter dplyr mean standard-deviation