Представление будет очень полезно при разработке решения вашей проблемы. Проблема здесь заключается в том, что каждый столбец может не иметь одинакового количества выбросов, но столбцы фрейма данных должны иметь одинаковую длину. Я бы рекомендовал собрать все целевые столбцы в пары ключ-значение и вместо этого отфильтровать результирующий фрейм данных Это вернет фрейм данных, содержащий все выбросы (метод IQR), идентифицированные парами ключ-значение.
В приведенном ниже примере я создаю фрейм данных с 2 столбцами данных и одним столбцом группировки. Столбцы v1
и v2
собираются в столбец ключа и значения перед группировкой по v3
. Затем новый столбец value
фильтруется для любых выбросов с использованием .25 - IQR * 1,5 и .75 + IQR * 1,5
. В результате получается кадр данных с 3 столбцами: v3
, key
и value
, где v3
- столбец группировки, key
содержит имена столбцов исходного фрейма данных, а value
содержит выбросы из исходного набора данных.
set.seed(12345)
df <- tibble(
v1 = rnorm(1000),
v2 = rnorm(1000),
v3 = c(rep("group a", 500), rep("group b", 500))
)
df %>%
gather(key = "key", value = "value", -v3) %>%
group_by(v3) %>%
filter(
value < (quantile(value, 0.25) - IQR(value, na.rm = TRUE) * 1.5) |
value > (quantile(value, 0.75) + IQR(value, na.rm = TRUE) * 1.5)
)
Вывод:
# A tibble: 16 x 3
# Groups: v4 [2]
v4 key value
<chr> <chr> <dbl>
1 group a v1 2.75
2 group b v1 3.33
3 group b v1 -2.78
4 group b v1 3.09
5 group a v3 -3.33
6 group a v3 3.29
7 group a v3 -2.77
8 group a v3 -2.97
9 group a v3 3.05
10 group b v3 2.70
11 group b v3 -2.81
12 group b v3 -2.77
13 group b v3 -3.13
14 group b v3 2.76
15 group b v3 -3.07
16 group b v3 -2.96
Это будет работать только в том случае, если все столбцы, кроме столбца группировки, имеют номера c. Любые другие типы приведут к сбою, потому что все столбцы собраны в один столбец значений, который должен быть одного типа.