r从data.frames列表中删除异常值并创建一个新的data.frames列表?

时间:2016-12-22 22:57:16

标签: r function functional-programming outliers identify

我在data.frame中有一个6的List

它有3列:

id,T_C,销售

T_C是TEST或CONTROL

有人在这里帮助了我,我学会了如何通过循环找到mean()和sd(),而不是做单独的陈述。

现在我的目标是从6个列表中删除异常值并生成6个列表(删除异常值后)。

str(dfList)#这是data.frames中的6的列表

我能够得到每个列表的mean()和sd(),如下所示:

list_mean_sd <- lapply(dfList,
                       function(df) 
                        {
                         df %>%
                           group_by(TC_INDICATOR) %>%
                           summarise(mean = mean(NET_SPEND),
                                     sd = sd(NET_SPEND))
                        })

> str(list_mean_sd)
List of 6  (1 obs. of  2 variables:)

我可以单独为平均值或sd选择它们:

sapply(list_mean_sd, "[", "mean")
sapply(list_mean_sd, "[", "sd")

基本上,我的目标是识别异常值并将其删除,产品替代或后置。

**outliers are:  mean - 3*sd()  or  mean + 3*sd()

我已经完成了这项工作,但是需要更多手动步骤,想要学习如何循环使用这些设置和类似的东西,感谢提前帮助我!

1 个答案:

答案 0 :(得分:0)

给它一个机会。首先,我创建了数据,我将其分成六个数据框,这些数据框位于列表中。

set.seed(0)
test_data <- data.frame(id = 1:10000, 
                        T_C = sample(c(TRUE, FALSE), size = 10000, replace = TRUE),
                        Sales = rnorm(n = 10000),
                        grp = sample(c("a", "b", "c", "d", "e", "f"), 
                                     size = 10000, replace = TRUE))

test_split <- split(test_data, test_data$grp)

然后,我在此列表中使用lapply来标识我正在调用z_scores的内容,这些mean计算为Sales Salessd之间的差异Sales除以z_score的{​​{1}}。最后,我们对这些使用过滤器来提取具有绝对值超过3的library(dplyr) outlier_list <- lapply(test_split, function(m) group_by(m, T_C) %>% mutate(z_score = (Sales - mean(Sales)) / sd(Sales)) %>% ungroup() %>% filter(abs(z_score) >= 3) ) > outlier_list $a # A tibble: 5 × 5 id T_C Sales grp z_score <int> <lgl> <dbl> <fctr> <dbl> 1 468 TRUE -2.995332 a -3.073314 2 3026 TRUE 3.028495 a 3.075258 3 5188 TRUE -3.097847 a -3.177952 4 7993 FALSE -3.571076 a -3.823983 5 9105 TRUE -3.216710 a -3.299276 $b # A tibble: 6 × 5 id T_C Sales grp z_score <int> <lgl> <dbl> <fctr> <dbl> 1 264 TRUE 3.003494 b 3.003329 2 2172 TRUE 3.001475 b 3.001326 3 2980 FALSE -3.176356 b -3.222782 4 3366 FALSE 3.009292 b 3.048559 5 7477 FALSE 3.348301 b 3.392265 6 7583 TRUE -3.089758 b -3.040911 $c # A tibble: 2 × 5 id T_C Sales grp z_score <int> <lgl> <dbl> <fctr> <dbl> 1 8078 TRUE 3.015343 c 3.129923 2 8991 FALSE 3.113526 c 3.058302 $d # A tibble: 5 × 5 id T_C Sales grp z_score <int> <lgl> <dbl> <fctr> <dbl> 1 544 TRUE 3.289070 d 3.168235 2 3791 FALSE 3.791938 d 3.769810 3 6771 FALSE -3.157741 d -3.166861 4 7864 TRUE 3.164128 d 3.045728 5 9371 TRUE -3.026884 d -3.024655 $e # A tibble: 6 × 5 id T_C Sales grp z_score <int> <lgl> <dbl> <fctr> <dbl> 1 186 FALSE 3.021541 e 3.046079 2 1211 TRUE 3.414337 e 3.343521 3 1665 TRUE 3.546282 e 3.473614 4 3765 FALSE 3.363641 e 3.391142 5 4172 TRUE 3.348820 e 3.278923 6 7973 FALSE -2.987790 e -3.015284 $f # A tibble: 6 × 5 id T_C Sales grp z_score <int> <lgl> <dbl> <fctr> <dbl> 1 1089 TRUE -3.195090 f -3.189979 2 2452 FALSE 3.287591 f 3.212317 3 3486 FALSE -3.334942 f -3.367962 4 4198 FALSE -3.102578 f -3.137082 5 8183 TRUE 3.081077 f 3.075324 6 8656 TRUE 3.253873 f 3.247822 的那些。

>= 3

显然,这只会给你一些异常值。如果您只想保留内容,请将< 3更改为inlier_list <- lapply(test_split, function(m) group_by(m, T_C) %>% mutate(z_score = (Sales - mean(Sales)) / sd(Sales)) %>% ungroup() %>% filter(abs(z_score) < 3) )

更新以在内部进行Wilcox测试

lapply

我们只使用OP注释中记录的参数在内部列表上运行wilcox_test_res <- lapply(inlier_list, function(m) wilcox.test(m$Sales ~ m$T_C, mu= mean(m$Sales[m$T_C == TRUE]), conf.level=0.95,

{{1}}