Изменение порядка данных в соответствии с несколькими качественными критериями (Alphabeti c Order) - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть набор данных в списке, который я назвал reord, состоящим из 521 вектора. Каждый вектор имеет 14 элементов. Только четыре столбца (элементы каждого отдельного вектора) важны для сортировки этого набора данных.

Я хочу создать новый набор данных, следующий за Alphabeti c Порядок этих столбцов: reord[[i]][10] затем reord[[i]][2], затем reord[[i]][3], а затем reord[[i]][6].

  • в 10-й столбец у нас есть 9 уровней: CAD, CHF ,. .., ... SEK, USD

  • во 2-й столбец у нас есть 3 уровня: A, D, Q

  • в 3-й столбец у нас есть 6 уровней: A, D, I, R, S, T

  • в 6-й столбец у нас есть 5 уровней: A, B, C, K, U

Каждый из этих столбцов будет устанавливать группу. 10-й столбец является более важным (устанавливает основной порядок), 2-й столбец следует за 10-м (устанавливает второй порядок), 3-й столбец следует за 2-й (Устанавливает третий порядок) и 6-й столбец следует за 3-й (Устанавливает четвертый порядок).

Пример выходного индекса (для переупорядочения оригинала набор данных) Я ищу:

  • CAD AAA
  • CAD AAB
  • CAD AA C
  • CAD AAK

  • ...

  • CAD ADA
  • CAD ADB
  • CAD AD C
  • CAD ADK
  • ...
  • ...
  • CAD QTU
  • CHF AAA
  • CHF AAB
  • ...
  • ...
  • ...
  • USD QTU

Это набор данных:

reord = list(c("H", "A", "A", "B", "5J", "A", "5J", "A", "TO1", "USD", 
"A", "A", "3", "C"), c("H", "D", "R", "B", "5J", "C", "5J", "A", 
"TO1", "CAD", "A", "A", "3", "C"), c("H", "A", "I", "B", "5J", 
"A", "5J", "A", "TO1", "JPY", "A", "A", "3", "C"), c("H", "A", 
"R", "B", "5J", "C", "5J", "A", "TO1", "$TO1+TO1-USD-EUR-JPY-GBP-CHF-CAD-SEK", 
"A", "A", "3", "C"), c("H", "D", "I", "B", "5J", "U", "5J", "A", 
"TO1", "JPY", "A", "A", "3", "C"), c("H", "A", "D", "B", "5J", 
"C", "5J", "A", "TO1", "EUR", "A", "A", "3", "C"), c("H", "D", 
"R", "B", "5J", "A", "5J", "A", "TO1", "SEK", "A", "A", "3", 
"C"), c("H", "Q", "C", "B", "5J", "B", "5J", "A", "TO1", "USD", 
"A", "A", "3", "A"), c("H", "D", "S", "B", "5J", "U", "5J", "A", 
"TO1", "JPY", "A", "A", "3", "A"), c("H", "A", "R", "B", "5J", 
"U", "5J", "A", "TO1", "SEK", "A", "A", "3", "C"), c("H", "A", 
"R", "B", "5J", "B", "5J", "A", "TO1", "$TO1+TO1-USD-EUR-JPY-GBP-CHF-CAD-SEK", 
"A", "A", "3", "C"), c("H", "A", "S", "B", "5J", "B", "5J", "A", 
"TO1", "JPY", "A", "A", "3", "A"), c("H", "D", "D", "B", "5J", 
"U", "5J", "A", "TO1", "JPY", "A", "A", "3", "C"), c("H", "D", 
"S", "B", "5J", "A", "5J", "A", "TO1", "$TO1+TO1-USD-EUR-JPY-GBP-CHF-CAD-SEK", 
"A", "A", "3", "A"), c("H", "D", "S", "B", "5J", "A", "5J", "A", 
"TO1", "GBP", "A", "A", "3", "A"), c("H", "D", "I", "B", "5J", 
"K", "5J", "A", "TO1", "CAD", "A", "A", "3", "C"), c("H", "D", 
"R", "B", "5J", "K", "5J", "A", "TO1", "CHF", "A", "A", "3", 
"C"), c("H", "A", "T", "B", "5J", "K", "5J", "A", "TO1", "JPY", 
"A", "A", "3", "A"), c("H", "D", "T", "B", "5J", "U", "5J", "A", 
"TO1", "CAD", "A", "A", "3", "A"), c("H", "Q", "C", "B", "5J", 
"A", "5J", "A", "TO1", "USD", "A", "A", "3", "A"), c("H", "A", 
"D", "B", "5J", "B", "5J", "A", "TO1", "EUR", "A", "A", "3", 
"C"), c("H", "A", "S", "B", "5J", "C", "5J", "A", "TO1", "EUR", 
"A", "A", "3", "A"), c("H", "D", "D", "B", "5J", "K", "5J", "A", 
"TO1", "CAD", "A", "A", "3", "C"), c("H", "D", "R", "B", "5J", 
"B", "5J", "A", "TO1", "SEK", "A", "A", "3", "C"), c("H", "D", 
"R", "B", "5J", "K", "5J", "A", "TO1", "TO1", "A", "A", "3", 
"C"), c("H", "D", "S", "B", "5J", "B", "5J", "A", "TO1", "$TO1+TO1-USD-EUR-JPY-GBP-CHF-CAD-SEK", 
"A", "A", "3", "A"), c("H", "D", "S", "B", "5J", "C", "5J", "A", 
"TO1", "$TO1+TO1-USD-EUR-JPY-GBP-CHF-CAD-SEK", "A", "A", "3", 
"A"), c("H", "D", "I", "B", "5J", "A", "5J", "A", "TO1", "GBP", 
"A", "A", "3", "C"), c("H", "A", "D", "B", "5J", "A", "5J", "A", 
"TO1", "JPY", "A", "A", "3", "C"), c("H", "A", "D", "B", "5J", 
"K", "5J", "A", "TO1", "$TO1+TO1-USD-EUR-JPY-GBP-CHF-CAD-SEK", 
"A", "A", "3", "C"))

Это сгруппированные элементы каждого столбца

##tenth column
tenth = sapply(reord, `[`, 10)
idx10 = split(seq_along(tenth), tenth)

##second column
second = sapply(reord, `[`, 2)              
idx2 = split(seq_along(second), second)

##third column
third = sapply(reord, '[', 3)
idx3 = split(seq_along(third), third)

##sixth column
sixth = sapply(reord, '[', 6)
idx6 = split(seq_along(sixth), sixth)

Как получить этот тип индекса для переупорядочения набора данных? Спасибо

1 Ответ

1 голос
/ 27 февраля 2020

Следующая функция соответствует описанию проблемы.
Если упорядоченные столбцы не являются столбцами 10, 2, 3, 6, как в вопросе, переопределите аргумент cols по умолчанию.

fun_order <- function(X, cols = c(10, 2, 3, 6)){
  X <- do.call(rbind.data.frame, X)
  X[] <- lapply(X, as.character)
  names(X) <- seq_along(X)
  i <- do.call(order, X[cols])
  outcols <- c(cols, seq_len(ncol(X))[-cols])
  Y <- X[i, outcols]
  row.names(Y) <- NULL
  list(index = i, cols = cols, data = Y)
}

fun_order(reord)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...