Переупорядочить набор данных с качественной информацией - PullRequest
0 голосов
/ 27 февраля 2020

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

По сути, я хочу изменить порядок столбцов, которые я разбил, чтобы все данные одной валюты были сгруппированы вместе. Эта информация хранится в 10-м элементе каждой строки этого набора данных (т. Е. reord[[1]][10] == "USD"). Поэтому мне нужно создать индекс для изменения порядка этих данных.

Это часть исходного столбца, которая относится к типу данных, которые я разделил:

 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"))

Я получил желаемый вывод, но наивно:

##Want to find the index of all the USD elements in the 10th position in everyrow
idxUSA = NULL
idxEUR = NULL
idxCHF = NULL
idxJPY = NULL
idxSEK = NULL
idxGBP = NULL
idxCAD = NULL
idxTO1 = NULL
idxOTHER = NULL
for(i in 1:length(reord)) {

  if(reord[[i]][10] == "USD") {
    print(reord[[i]][10])
  idxUSA = c(idxUSA,i)
  }

  if(reord[[i]][10] == "EUR") {
    print(reord[[i]][10])
    idxEUR = c(idxEUR,i)
  }

  if(reord[[i]][10] == "JPY") {
    print(reord[[i]][10])
    idxJPY = c(idxJPY,i)
  }

  if(reord[[i]][10] == "TO1") {
    print(reord[[i]][10])
    idxTO1 = c(idxTO1,i)
  }

  if(reord[[i]][10] == "SEK") {
    print(reord[[i]][10])
    idxSEK = c(idxSEK,i)
  }

  if(reord[[i]][10] == "CHF") {
    print(reord[[i]][10])
    idxCHF = c(idxCHF,i)
  }

   if(reord[[i]][10] == "GBP") {
    print(reord[[i]][10])
    idxGBP = c(idxGBP,i)
  }

  if(reord[[i]][10] == "CAD") {
    print(reord[[i]][10])
    idxCAD = c(idxCAD,i)
  }

  if(reord[[i]][10] == "$TO1+TO1-USD-EUR-JPY-GBP-CHF-CAD-SEK") {
    print(reord[[i]][10])
    idxOTHER = c(idxOTHER,i)
  }
}

Как я могу оптимизировать этот процесс? Спасибо.

1 Ответ

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

Если я правильно понял, вы можете сделать это

tenth <- sapply(reord, `[`, 10)
idx <- split(seq_along(tenth), tenth)

Сначала мы создадим вектор с десятым элементом каждого элемента в списке. Затем мы разделяем индексированные по значениям. Так что теперь мы можем получить все индексы для значений в долларах США с помощью

idx$USD
# [1]  1  8 20
# or idx[["USD"]]

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

reord[unlist(idx)]

Это сгруппирует все валюты вместе.

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