Выбросы для всех столбцов, с группировкой в ​​R - PullRequest
0 голосов
/ 07 марта 2020

Как я могу получить список выбросов для каждого столбца, для каждой группы, , если я хочу сгруппировать данные по определенному столбцу?

Я не хочу удалять их, я просто хочу иметь их в качестве вывода.

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Представление будет очень полезно при разработке решения вашей проблемы. Проблема здесь заключается в том, что каждый столбец может не иметь одинакового количества выбросов, но столбцы фрейма данных должны иметь одинаковую длину. Я бы рекомендовал собрать все целевые столбцы в пары ключ-значение и вместо этого отфильтровать результирующий фрейм данных Это вернет фрейм данных, содержащий все выбросы (метод 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. Любые другие типы приведут к сбою, потому что все столбцы собраны в один столбец значений, который должен быть одного типа.

0 голосов
/ 07 марта 2020

После группировки данных по интересующему столбцу, summarise для остальных столбцов с помощью функции boxplot.stats, извлеките компонент out и paste в одну строку (или также можно вернуть как list столбец)

library(dplyr)
df1 %>%
     group_by(grpColumn) %>%
     summarise_at(vars(-group_cols()), ~ toString(boxplot.stats(.)$out))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...