Определить структуру всех данных

Скажем, у вас есть следующие данные:

data <- tibble::tribble(~Countries, ~States,   ~Continents,
                        "Country 1",      1L, "continent 1",
                        "Country 1",      2L, "continent 1",
                        "Country 1",      3L, "continent 1",
                        "Country 1",      4L, "continent 1",
                        "Country 2",      1L, "continent 1",
                        "Country 2",      2L, "continent 1",
                        "Country 2",      3L, "continent 1",
                        "Country 2",      4L, "continent 1",
                        "Country 3",      1L, "continent 1",
                        "Country 3",      2L, "continent 1",
                        "Country 3",      3L, "continent 1",
                        "Country 3",      4L, "continent 1",
                        "Country 1",      1L, "continent 2",
                        "Country 1",      2L, "continent 2",
                        "Country 1",      3L, "continent 2",
                        "Country 1",      4L, "continent 2",
                        "Country 2",      1L, "continent 2",
                        "Country 2",      2L, "continent 2",
                        "Country 2",      3L, "continent 2",
                        "Country 2",      4L, "continent 2",
                        "Country 3",      1L, "continent 2",
                        "Country 3",      2L, "continent 2",
                        "Country 3",      3L, "continent 2",
                        "Country 3",      4L, "continent 2")

Эти данные могут иметь много переменных разных форматов с разным уровнем детализации. Я хочу понять структуру данных, чтобы можно было сказать, что наивысшим уровнем данных является Континент с 2 значениями, следующим уровнем детализации являются округа с 3 значениями, а наименьшим уровнем являются состояния с 4 значениями в приведенных выше данных.

  1. Один грубый способ понять это может состоять в том, чтобы оставить переменную / переменные с наименьшим количеством различных значений слева, т.е. континенты, и значения с наибольшим количеством различных значений, то есть состояний справа от набора данных.

  2. Еще более простой способ разобраться в беспорядочных данных - это создать некую древовидную диаграмму и видеть наименьшие детализованные данные наверху, на континентах, здесь и большинство гранулированных данных на нижних состояниях, здесь, в виде листьев / узлов.

В качестве первого среза, мы можем использовать трюки, такие как показ одной или двух переменных сначала / вверху в случаях связей, когда количество уникальных значений одинаково.

Если делать 2-е трудно, как мы можем сделать по крайней мере 1-е? ... Может быть, путем оценки различных значений каждой переменной в любых общих беспорядочных данных, а затем упорядочивание переменных! Любой другой метод с сопровождающим кодом R был бы очень полезен.

Решение по первому пункту будет выглядеть так:

data <- tibble::tribble( ~Continents,  ~Countries,   ~States,
                         "continent 1", "Country 1",   1L,
                         "continent 1", "Country 1",   2L,
                         "continent 1", "Country 1",   3L,
                         "continent 1", "Country 1",   4L,
                         "continent 1", "Country 2",   1L,
                         "continent 1", "Country 2",   2L,
                         "continent 1", "Country 2",   3L,
                         "continent 1", "Country 2",   4L,
                         "continent 1", "Country 3",   1L,
                         "continent 1", "Country 3",   2L,
                         "continent 1", "Country 3",   3L,
                         "continent 1", "Country 3",   4L,
                         "continent 2", "Country 1",   1L,
                         "continent 2", "Country 1",   2L,
                         "continent 2", "Country 1",   3L,
                         "continent 2", "Country 1",   4L,
                         "continent 2", "Country 2",   1L,
                         "continent 2", "Country 2",   2L,
                         "continent 2", "Country 2",   3L,
                         "continent 2", "Country 2",   4L,
                         "continent 2", "Country 3",   1L,
                         "continent 2", "Country 3",   2L,
                         "continent 2", "Country 3",   3L,
                         "continent 2", "Country 3",   4L)

1 ответ

Решение

Если я правильно понял, приведенный ниже код отвечает на ваши вопросы:

data[order(sapply(data, function(x) length(unique(x))))] # returns the data in the desired order

# simple function for plotting the 'tree'. 
plotTree <- function(lengths, names, space = 0.3){
  L    <- lengths[O <- order(lengths)]
  N    <- names[O]
  XMax <- max(L)
  YMax <- (length(L))
  plot(NULL, xlim = c(-XMax, XMax), ylim = c(-YMax, YMax), axes = F, xlab = "", ylab = "")
  for (i in 1:length(L)){
    rect(-L[i], YMax - 1 - i *  (space + 1), L[i], YMax - i *  (space + 1), col = i)
    text(0, YMax - 1/2 - i * (space + 1), N[i], col = if (i == 1) "white" else "black")
  }
}

# usage
plotTree(sapply(data, function(x) length(unique(x))), names(data), space = 0.3)
Другие вопросы по тегам