У меня есть несколько матриц, все они имеют один и тот же тип элементов, но разную длину. Столбцы во всех файлах одинаковы (назовем их A и B), но строки между файлами — это в основном одни и те же элементы, но не всегда.
Вот несколько примеров данных (в виде фреймов данных)
df1 <- data.frame(A = 1:3, B = 3:1)
rownames(df1)=c("alpha","beta","gamma")
df2 <- data.frame(A = 1:5,B = 5:1)
rownames(df2)=c("alpha","beta","delta","gamma","zeta")
df3 <- data.frame(A = 1:7, B = 7:1)
rownames(df3)=c("alpha","beta","delta","gamma","zeta","theta","epsilon")
как вы можете видеть, насколько далеко идут строки, хотя альфа, бета и гамма всегда присутствуют, многие другие не всегда есть
Я хотел бы вычислить 2 вещи: средние значения всех столбцов A и B во всех матрицах, и в идеале это было бы путем создания ave.matr, который имел бы все имена строк и средние / средние значения столбцов A и B
A B
alpha 1 7
beta 2 6
delta 3 5
gamma 4 4
zeta 5 3
theta 6 2
epsilon 7 1
(где указанные выше числа являются средними значениями всех матриц)
а затем матрицу вхождений, позвольте вызвать ее .matr, которая будет подсчитывать количество вхождений каждой строки во всех матрицах, и это должно выглядеть так
A B
alpha 3
beta 3
delta 2
gamma 3
zeta 2
theta 1
epsilon 1
Я начал работать над этим сегодня, но не могу понять, как это сделать.
Я начал с создания списка и матрицы с уникальными именами всех матриц.
list=c(rownames(df1),rownames(df2),rownames(df3))
unique=unique(list)
avematr<-matrix(NA,nrow=length(unique),ncol=2)
и моим следующим шагом было бы сделать одинаковые имена всех матриц. Я пробовал использовать совпадение, но не могу понять, но на данный момент я даже не знаю, лучшая ли это стратегия … И все похожие вопросы связаны со слиянием матриц (это не то, что я хочу делать).
Любая помощь приветствуется
Вот примерный подход:
Создано 27 января 2021 года пакетом REPEX (v0.3.0)
прекрасно бегает! — person Panos; 27.01.2021
+1, Хороший ответ с использованием библиотеки tidyverse! Первую часть можно еще уменьшить с помощью
dat <- list(df1, df2, df3) %>% map_dfr(rownames_to_column)
. — person Panos; 27.01.2021Спасибо, хорошее замечание! Когда я использовал
reduce
, мне было сложно писать это. Я изменил это в приведенном выше коде. — person Panos; 27.01.2021Если вы хотите придерживаться основы R:
Для задачи усреднения это упрощает, если вы добавляете свое имя в качестве столбца. Это предотвращает автонумерацию имен строк при объединении фреймов данных. Затем вы можете просто перебрать каждое уникальное имя и построить средние значения. Быстрое и грязное решение может выглядеть так:
приводит к:
Для матрицы вхождений вы можете использовать функцию
table()
из R:дает: