Группировка участка стебель-лист в R - PullRequest
1 голос
/ 27 мая 2020

У меня есть сюжет стволовых листьев в качестве вопроса, который выглядит так:

0 | 6
1 | 179
2 | 26
3 | 2478
4 | 15699
5 | 368
6 | 24457
7 | 
8 | 56

Итак, я создал вектор самостоятельно, который будет создавать стволовый сюжет, такой же, как и приведенный выше .

data <- c(06,11,17,19,22,26,32,34,37,38,41,45,46,49,49,53,56,58,62,64,64,65,67,7,85,86)

Что мне нужно сделать, так это то, что мне нужно сгруппировать стержни по 2, а затем построить соответствующий график стержня, используя R.

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

0-2|6*179*26
3-5|2478*15699*368
6-8|244457**56

"*" используется для разделения листьев каждого стебля в группе. т.е. для группы стержень 0-2 это означает, что лист 6 в первом ряду соответствует стержню 0; листья 1,7 и 9 соответствуют стеблю 1, а листья 2 и 6 соответствуют стеблю 2.

Я не нашел применения в стебле (), поэтому подумал о разделении данных на 2 с помощью функции «интервал», и затем создайте одну определяемую пользователем функцию, но в результате я получил то же значение основы.

Есть ли способ получить желаемое решение, используя встроенную функцию / определяемую пользователем? Заранее большое спасибо.!!

1 Ответ

0 голосов
/ 29 мая 2020

Это не поможет выиграть ни один конкурс красоты, но вы определенно можете использовать комбинацию cut и некоторой обработки строк для создания своей собственной сгруппированной stem функции.

Вот пример функции, прокомментировал, чтобы вы могли расширить его в соответствии с вашими фактическими потребностями:

grouped_stem <- function(invec, n = 3) {
  # Sequence of lowest tens and highest tens in the input data, by 10
  cuts <- seq((min(invec) %/% 10) * 10, round(max(invec), -(nchar(max(invec))-1)), 10)
  # For pretty labels in `cut`
  labs <- sub("(.*).$", "\\1", cuts)
  labs <- replace(labs, !nzchar(labs), "0")
  # List of the values according to their `cut` intervals
  temp <- split(invec, cut(invec, cuts, labs[-length(labs)], right = FALSE))
  # Only interested in the last digit
  temp <- relist(sub(".*(.)$", "\\1", unlist(temp, use.names = FALSE)), temp)
  # Paste the values together. Add in a "*" that we can get rid of later if not required
  combined <- vapply(temp, function(y) sprintf("%s*", paste(y, collapse = "")), character(1L))
  # Split by number of groups of tens per stem
  splits <- split(combined, ((seq_along(combined)-1) %/% n))
  # Construct the stems and leaves
  stems <- vapply(splits, function(x) {
    paste(names(x)[1], names(x)[length(x)], sep = " to ")
  }, character(1L))
  leaves <- vapply(splits, function(x) {
    sub("[*]$", "", paste(x, sep = "", collapse = ""))
  }, character(1L))
  # Print and store
  cat(sprintf(sprintf("%%%ss | %%s", max(nchar(stems))+2), stems, leaves), sep = "\n")
  invisible(setNames(as.list(leaves), stems))
}

Запустите образец данных, он выдаст:

grouped_stem(data)
##   0 to 2 | 67*179*26
##   3 to 5 | 2478*15699*368
##   6 to 8 | 24457**56
...