Вот пример одного конкретного подхода, использующего поддельные данные.Если у вас есть более конкретные требования, они должны быть добавлены к вашему вопросу.
Сначала я сделаю несколько поддельных данных с 30 столбцами.Например, я сделаю так, чтобы каждый столбец имел случайные числа со средним значением и sd, соответствующим столбцу.Первый столбец будет иметь среднее значение и sd = 1, второй - среднее значение и sd = 2 и т. Д.
columns = 30
samples = 100000
library(tidyverse)
set.seed(42)
my_data <- data_frame(row = rep(1:samples, times = columns),
col = rep(1:columns, each = samples),
value = rnorm(samples*columns, mean = col, sd = col)) %>%
mutate(col = paste0("c", str_pad(col, 2, pad = "0"))) %>%
spread(col, value)
Здесь я подтверждаю, что в каждой строке есть ожидаемое среднее значение и дисперсия:
my_data %>%
gather(col, value, -row) %>%
sample_n(10000) %>% # 10k dots is enough and is quicker to plot than all of them.
ggplot(aes(col, value)) +
geom_point(alpha = 0.1, size = 0.5, color = "gray40") +
geom_boxplot(fill = NA, outlier.shape = NA) +
scale_y_continuous(breaks = 60*-2:2)
Для этого подхода я ранжирую ряды на основе их отдаленности от среднего и оставляю те, которые находятся ближе всего.Я определю «ближайший к среднему» на основе того, какая строка имеет наименьшее среднеквадратичное отклонение от средних значений.
Здесь я вычислю, как далеко каждая точка от среднего значения для своего столбца, затем для каждой строки найдитесредняя RMS абсолютная разница по всем столбцам.Я оставлю верхние 5 в фрейме данных с именем most_typical
, а нижние 5 в least_typical
.
my_data_how_typical <- my_data %>%
gather(col, value, -row) %>% # convert to long format
group_by(col) %>% # group by column
mutate(dist_abs = value - mean(value)) %>% # calc dist from mean for that col
ungroup() %>%
group_by(row) %>%
summarize(avg_dist_abs = sqrt(mean(dist_abs ^ 2)))
most_typical <- top_n(my_data_how_typical, 5, wt = -avg_dist_abs)
least_typical <- top_n(my_data_how_typical, 5, wt = avg_dist_abs)
Теперь я построю пятерку самых и наименее типичных по отношению к целому.Зеленые строки most_typical
имеют тенденцию оставаться вблизи средних, в то время как least_typical
имеют некоторые экстремальные значения.Сохраняя строки с наименьшим отклонением от среднего (вы можете оставить 1000 вместо 5), вы получите список, в котором средние значения будут близки к общему среднему.Но этот список также будет иметь значительно меньшую дисперсию, чем исходные данные, поскольку он намеренно исключает строки с экстремальными значениями.
my_data %>%
gather(col, value, -row) %>%
sample_n(10000) %>%
ggplot(aes(col, value)) +
geom_point(alpha = 0.1, size = 0.5, color = "gray40") +
geom_line(data = least_typical %>%
select(row) %>%
left_join(my_data, by = c("row" = "row")) %>%
gather(col, value, -row),
aes(col, value, group = row), color = "red") +
geom_line(data = most_typical %>%
select(row) %>%
left_join(my_data, by = c("row" = "row")) %>%
gather(col, value, -row),
aes(col, value, group = row), color = "green")
Вашданные будут выглядеть по-разному, и ваше определение «наиболее близко к среднему» может отличаться, но, надеюсь, это приведет вас в правильном направлении.