R 从多个矩阵计算平均值和发生率

R 从多个矩阵计算平均值和发生率,r,matrix,average,R,Matrix,Average,我有很多矩阵,它们都有相同类型的元素,但长度不同。所有文件中的列都是相同的(让我们称它们为“A”和“B”),但文件之间的行基本上是相同的元素,但并不总是相同的 以下是一些示例数据(以数据帧的形式) (其中上述数字是所有矩阵的平均值) 然后是一个出现矩阵,我们称之为occurrent.matr,它将计算所有矩阵中每行出现的次数,它应该是这样的 A B alpha 3 beta 3 delta 2 gamma 3 zeta 2 the

我有很多矩阵,它们都有相同类型的元素,但长度不同。所有文件中的列都是相同的(让我们称它们为“A”和“B”),但文件之间的行基本上是相同的元素,但并不总是相同的

以下是一些示例数据(以数据帧的形式)

(其中上述数字是所有矩阵的平均值)

然后是一个出现矩阵,我们称之为occurrent.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)
list=c(行名(df1)、行名(df2)、行名(df3))
唯一=唯一(列表)

avematr如果您想坚持使用基本R:

对于平均任务,将rowname添加为列会使事情变得更容易。这将防止在组合数据帧时对行名进行自动编号。然后,您可以简单地循环每个唯一的行名并构造平均值。快速而肮脏的解决方案可能如下所示:

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

add_row_names_to_df <- function(df) {
    df$rn <- rownames(df)
    return(df)
}

new_df <- rbind(add_row_names_to_df(df1), 
                add_row_names_to_df(df2), 
                add_row_names_to_df(df3))

avg_df <- as.data.frame(matrix(unique(new_df$rn),
                               nrow = length(unique(new_df$rn)), 
                               ncol = 3))

for(i in 1:nrow(avg_df)) {
    avg.df[i,] <- c(avg_df[i,1],
                    mean(new_df$A[new_df$rn==avg_df[i,1]]),
                    mean(new_df$B[new_df$rn==avg_df[i,1]]))
}
colnames(avg_df) <- c("rowname", "avgA", "avgB")
avg_df
对于发生矩阵,您可以使用R中的
table()
函数:

as.matrix(table(c(rownames(df1),rownames(df2),rownames(df3))))
收益率:

        [,1]
alpha      3
beta       3
delta      2
epsilon    1
gamma      3
theta      1
zeta       2

如果您想坚持基本R:

对于平均任务,将rowname添加为列会使事情变得更容易。这将防止在组合数据帧时对行名进行自动编号。然后,您可以简单地循环每个唯一的行名并构造平均值。快速而肮脏的解决方案可能如下所示:

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

add_row_names_to_df <- function(df) {
    df$rn <- rownames(df)
    return(df)
}

new_df <- rbind(add_row_names_to_df(df1), 
                add_row_names_to_df(df2), 
                add_row_names_to_df(df3))

avg_df <- as.data.frame(matrix(unique(new_df$rn),
                               nrow = length(unique(new_df$rn)), 
                               ncol = 3))

for(i in 1:nrow(avg_df)) {
    avg.df[i,] <- c(avg_df[i,1],
                    mean(new_df$A[new_df$rn==avg_df[i,1]]),
                    mean(new_df$B[new_df$rn==avg_df[i,1]]))
}
colnames(avg_df) <- c("rowname", "avgA", "avgB")
avg_df
对于发生矩阵,您可以使用R中的
table()
函数:

as.matrix(table(c(rownames(df1),rownames(df2),rownames(df3))))
收益率:

        [,1]
alpha      3
beta       3
delta      2
epsilon    1
gamma      3
theta      1
zeta       2

以下是一种整洁的方法:

库(tidyverse)
df1#A tible:7 x 3
#>身份证
#>       
#>1阿尔法15
#>2 beta 2 4
#>3三角洲34
#>4ε7 1
#>5伽马3.67 2.33
#>6θ6 2
#>7泽塔5 2
occ_数据百分比计数(id)
occ_dat
#>身份证号码
#>1阿尔法3
#>2β3
#>3三角洲2
#>4ε1
#>5伽马3
#>6θ1
#>7泽塔2号

由(v0.3.0)于2021-01-27创建,这里是一个tidyverse方法:

库(tidyverse)
df1#A tible:7 x 3
#>身份证
#>       
#>1阿尔法15
#>2 beta 2 4
#>3三角洲34
#>4ε7 1
#>5伽马3.67 2.33
#>6θ6 2
#>7泽塔5 2
occ_数据百分比计数(id)
occ_dat
#>身份证号码
#>1阿尔法3
#>2β3
#>3三角洲2
#>4ε1
#>5伽马3
#>6θ1
#>7泽塔2号

由(v0.3.0)创建于2021-01-27运行良好+1、使用tidyverse库回答得很好!使用
dat%map\u-dfr(rownames\u-to\u-column)
可以进一步减少第一部分内容。谢谢,说得好!写这篇文章时,当我使用
reduce
时,感觉很复杂。我在上面的代码中更改了它。运行得很好+1、使用tidyverse库回答得很好!使用
dat%map\u-dfr(rownames\u-to\u-column)
可以进一步减少第一部分内容。谢谢,说得好!写这篇文章时,当我使用
reduce
时,感觉很复杂。我在上面的代码中改变了这一点。