如何使用R将一个 Dataframe 列表合并为一个 Dataframe ?

j2cgzkjk  于 2023-04-09  发布在  其他
关注(0)|答案(2)|浏览(166)

我有一个数据框列表

A1 = data.frame(name = c("a1", "a3", "a5"), cor = c(1, 0.99, 0.93))
A2 = data.frame(name = c("a2", "a3", "a4"), cor = c(1, 0.94, 0.94))
A3 = data.frame(name = c("a3", "a1", "a2", "a6"), cor = c(1, 0.99, 0.94, 0.91))
myList = list(A1, A2, A3)

每个 Dataframe 是计算的相关系数(CC)。
例如:
A1中,a1 and a1之间的CC为1,a1 and a3之间的CC为0.99,a1 and a5之间的CC为0.93;
A2中,a2 and a2之间的CC为1,a2 and a3之间的CC为0.94,a2 and a4之间的CC为0.94。
我想做的是将这些单独的dataframe组合成一个完整的dataframe,如下所示:

corMatrix
     a1   a2   a3   a4   a5   a6
a1 1.00 0.00 0.99 0.00 0.93 0.00
a2 0.00 1.00 0.94 0.94 0.00 0.00
a3 0.99 0.94 1.00 0.00 0.00 0.91
a4 0.00 0.94 0.00 1.00 0.00 0.00
a5 0.93 0.00 0.00 0.00 1.00 0.00
a6 0.00 0.00 0.91 0.00 0.00 1.00

这个corMatrix Dataframe 包含了上述 Dataframe 的所有相关信息,如果两个变量的相关信息未知,则用0来表示它们的CC值,比如变量a1 and a2
我该怎么做?
多谢了。

5ktev3wc

5ktev3wc1#

在Base R中,你可以:

a <- do.call(rbind,Map(cbind, name1 = c('a1','a2', 'a3'), myList))
b <- unique(rbind(a, setNames(a[c(2,1,3)], names(a))))
xtabs(cor~., b)

    name
name1   a1   a2   a3   a4   a5   a6
   a1 1.00 0.00 0.99 0.00 0.93 0.00
   a2 0.00 1.00 0.94 0.94 0.00 0.00
   a3 0.99 0.94 1.00 0.00 0.00 0.91
   a4 0.00 0.94 0.00 0.00 0.00 0.00
   a5 0.93 0.00 0.00 0.00 0.00 0.00
   a6 0.00 0.00 0.91 0.00 0.00 0.00
fjaof16o

fjaof16o2#

我相信这就是你要找的,尽管这可能不是最好的方法:

A1 = data.frame(name = c("a1", "a3", "a5"), cor = c(1, 0.99, 0.93))
A2 = data.frame(name = c("a2", "a3", "a4"), cor = c(1, 0.94, 0.94))
A3 = data.frame(name = c("a3", "a1", "a2", "a6"), cor = c(1, 0.99, 0.94, 0.91))
myList = list(A1, A2, A3)

names(myList) = c("a1", "a2", "a3")
myMatrix = dplyr::bind_rows(myList, .id = "name2") |> 
  dplyr::mutate(name2 = factor(name2, levels = c("a1", "a2", "a3", "a4", "a5", "a6")),
                name = factor(name, levels = c("a1", "a2", "a3", "a4", "a5", "a6"))) |> 
  tidyr::complete(name2, name, fill = list(cor = 0)) |> 
  tidyr::pivot_wider(names_from = name2, values_from = cor) |> 
  tibble::column_to_rownames("name") |> 
  as.matrix() 
diag(myMatrix) <- 1
myMatrix[upper.tri(myMatrix)] <- t(myMatrix)[upper.tri(myMatrix)]

其返回:

a1   a2   a3   a4   a5   a6
a1 1.00 0.00 0.99 0.00 0.93 0.00
a2 0.00 1.00 0.94 0.94 0.00 0.00
a3 0.99 0.94 1.00 0.00 0.00 0.91
a4 0.00 0.94 0.00 1.00 0.00 0.00
a5 0.93 0.00 0.00 0.00 1.00 0.00
a6 0.00 0.00 0.91 0.00 0.00 1.00

总体思路是:

  • 命名列表以确保您知道它们是哪些相关性(如果列表较长,可以使用paste()以编程方式完成此操作)
  • 将所有列表元素组合到一个 Dataframe 中
  • 使用factors填充所有可能的元素(如果需要,也可以通过编程完成)
  • 完成为缺失值添加0
  • 切换到矩阵,对角线加1,并使对角线对称

相关问题