Объединение Grep и For-Loop для построения матрицы (R)

-4

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

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

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" и "Aramis", а затем объединить эти три столбца по строкам в финальный dataframe.

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

Редактировать: @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"))) )

спросил(а) 2019-04-17T18:18:00+03:00 1 год, 1 месяц назад
0
54

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

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 из этих матриц в комбинированную матрицу в форме, как вы описали?

Изменить: Затем код, решающий вашу проблему:

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

ответил(а) 2019-04-17T19:13:00+03:00 1 год, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема