Объединение Grep и For-Loop для построения матрицы (R) - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть огромный список небольших фреймов данных, которые я хотел бы осмысленно объединить в один, однако логика того, как это сделать, ускользает от меня.

Например, если у меня есть список фреймов данныхэто выглядит примерно так, хотя и с гораздо большим количеством файлов, многие из которых мне не нужны в моем фрейме данных:

MyList = c("AthosVersusAthos.csv", "AthosVerusPorthos.csv", "AthosVersusAramis.csv", "PorthosVerusAthos.csv", "PorthosVersusPorthos.csv", "PorthosVersusAramis.csv", "AramisVersusAthos.csv", "AramisVersusPorthos.csv", "AramisVerusPothos.csv", "BobVersusMary.csv", "LostCities.txt")

Я хочу собрать их в один большой фрейм данных.Что бы выглядело так:

                   |                    |
 AthosVersusAthos  | PorthosVersusAthos | AramisVersusAthos
                   |                    |
 ------------------------------------------------------
                   |                    |
 AthosVerusPorthos | PothosVersusPorthos| AramisVersusPorthos
                   |                    |
 ------------------------------------------------------
                   |                    |
 AthosVersusAramis | PorthosVersusAramis| AramisVersusAramis
                   |                    |

Или, возможно, более правильно (с номерами выборок только в одной части матрицы):

           |       Athos      |      Porthos       |    Aramis
    -------|------------------------------------------------------
           | 10     9      5  |                    |
    Athos  | 2      10     4  |                    | 
           | 3      0      10 |                    |
    -------|------------------------------------------------------
           |                  |                    |
   Porthos |                  |                    |                  
           |                  |                    |
    -------|------------------------------------------------------
           |                  |                    |
   Aramis  |                  |                    |                  
           |                  |                    |
    -------------------------------------------------------------

До сих пор мне удавалось:

Musketeers = c("Athos", "Porthos", "Aramis")

  for(i in 1:length(Musketeers)) {
    for(j in 1:length(Musketeers)) {

    CombinedMatrix <- cbind (

      rbind(MyList[grep(paste0("^(", Musketeers[i],
      ")(?=.*Versus[", Musketeers[j], "]"), names(MyList),
      value = T, perl=T)])

  )
 }
}

То, что я пытался сделать, это объединить мою команду grep (весьма важно, учитывая количество файлов и специфичность, с которой мне нужно их выбрать), а затем объединить rbind и cbind такчто строки и столбцы матрицы содержательно сцеплены.

Мой общий план состоял в том, чтобы объединить все кадры данных, начинающиеся с 'Athos', в один столбец, и сделать это еще раз для кадров данных, начинающихся с 'Porthos'и' Арамис ', а затем объединить эти три столбца по строкам в окончательный кадр данных.

Я знаю, что я довольно далеко, но я не могу понять, с чего начать.

Редактировать: @PierreGramme сгенерировал полезный набор данных модели, который я добавлю ниже, поскольку я думаю, что было бы полезно предоставить его первоначально.

Musketeers = c("Athos", "Porthos", "Aramis")
MyList = c("AthosVersusAthos.csv", "AthosVersusPorthos.csv", "AthosVersusAramis.csv", 
                    "PorthosVersusAthos.csv", "PorthosVersusPorthos.csv", "PorthosVersusAramis.csv", 
                    "AramisVersusAthos.csv", "AramisVersusPorthos.csv", "AramisVersusAramis.csv",
                    "BobVersusMary.csv", "LostCities.txt")
MyList = lapply(setNames(nm=MyList), function(x) matrix(rnorm(9), nrow=3, dimnames=list(c("a","b","c"), c("x","y","z"))) )

1 Ответ

1 голос
/ 17 апреля 2019

Сначала сделайте воспроизводимый пример. Верно ли это? Если так, я добавлю код для ответа

Musketeers = c("Athos", "Pothos", "Aramis")
MyList = c("AthosVersusAthos.csv", "AthosVersusPothos.csv", "AthosVersusAramis.csv", 
                    "PothosVersusAthos.csv", "PothosVersusPothos.csv", "PothosVersusAramis.csv", 
                    "AramisVersusAthos.csv", "AramisVersusPothos.csv", "AramisVersusAramis.csv",
                    "BobVersusMary.csv", "LostCities.txt")
MyList = lapply(setNames(nm=MyList), function(x) matrix(rnorm(9), nrow=3, dimnames=list(c("a","b","c"), c("x","y","z"))) )

И тогда верно ли, что вы хотите объединить 9 из этих матриц в комбинированную матрицу в форме, как вы описали?

Edit: Тогда код, решающий вашу проблему:

# Helper function to extract the relevant portion of MyList and rbind() it
makeColumns = function(n){
    re = paste0("^",n,"Versus")
    sublist = MyList[grep(re, names(MyList))]
    names(sublist) = sub(re, "", sub("\\.csv$","", names(sublist)))

    # Make sure sublist is sorted correctly and contains info on all musketeers
    sublist = sublist[Musketeers]

    # Change row and col names so that they are unique in the final result
    sublist = lapply(names(sublist), function(m) {
        res = sublist[[m]]
        rownames(res) = paste0(m,"_",rownames(res))
        colnames(res) = paste0(n,"_",colnames(res))
        res
    })

    do.call(rbind, sublist)
}

lColumns = lapply(setNames(nm=Musketeers), makeColumns)
CombinedMatrix = do.call(cbind, lColumns)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...