我有一个命名的数值向量,称为Rs.该向量有8个元素,如下所示:c(L2DA.L2DF= .637, L2DA.L2G= 0.553,...).

我可以使用metafor::vec2mat(Rs)(see below)将这个命名的数字向量转换为8x8相关矩阵.

Question:,但我想知道如何为该相关矩阵分配行名和联名,以便这些名称表示我原始命名的数字向量中的名称?

例如,在矩阵中,元素[1,1]=0.637来自向量的第一个元素,因此它应该具有列名称L2DA和行名L2DF,依此类推.

library(metafor)

dat <- read.csv("https://raw.githubusercontent.com/ilzl/i/master/j.csv")

dat$var1.var2 <- apply(dat[c("var1","var2")],1,paste0,collapse=".")

res <- rma(ri~var1.var2+0,1, data=dat)

(Rs = setNames(coef(res),sub("var1.var2","",names(coef(res)))))

(R_matrix = vec2mat(Rs))

          [,1]  [,2]      [,3]      [,4]      [,5]      [,6]      [,7]      [,8]
[1,] 1.0000000 0.637 0.5533333 0.4180000 0.5550000 0.5678947 0.4781481 0.3675000
[2,] 0.6370000 1.000 0.2440000 0.2900000 0.4840000 0.3500000 0.4750000 0.5700000
[3,] 0.5533333 0.244 1.0000000 0.2933333 0.5100000 0.3300000 0.4775000 0.5765714
[4,] 0.4180000 0.290 0.2933333 1.0000000 0.4627778 0.5212121 0.5569565 0.4928571
[5,] 0.5550000 0.484 0.5100000 0.4627778 1.0000000 0.4695652 0.5140625 0.5313793
[6,] 0.5678947 0.350 0.3300000 0.5212121 0.4695652 1.0000000 0.5194118 0.5258333
[7,] 0.4781481 0.475 0.4775000 0.5569565 0.5140625 0.5194118 1.0000000 0.4240000
[8,] 0.3675000 0.570 0.5765714 0.4928571 0.5313793 0.5258333 0.4240000 1.0000000

推荐答案

首先,vec2matmasking是个问题:

Rs
# L2DA.L2DF  L2DA.L2G  L2DA.L2L  L2DA.L2M  L2DA.L2P  L2DA.L2V  L2DF.L2G  L2DF.L2L  L2DF.L2M  L2DF.L2P  L2DF.L2V   L2G.L2L   L2G.L2M   L2G.L2P   L2M.L2L 
# 0.6370000 0.5533333 0.4180000 0.5550000 0.5678947 0.4781481 0.3675000 0.2440000 0.2900000 0.4840000 0.3500000 0.4750000 0.5700000 0.2933333 0.5100000 
#   L2P.L2L   L2P.L2M  L2R.L2DA  L2R.L2DF   L2R.L2G   L2R.L2L   L2R.L2M   L2R.L2P   L2R.L2V   L2V.L2G   L2V.L2L   L2V.L2M   L2V.L2P 
# 0.3300000 0.4775000 0.5765714 0.4627778 0.5212121 0.5569565 0.4928571 0.4695652 0.5140625 0.5313793 0.5194118 0.5258333 0.4240000 

请注意,有SIXL2DA.*个值,这意味着矩阵的第一列(推断应该是"L2DA",应该介于0.6370.478之间).然而,它也包括L2DF.L2G的值:

vec2mat(Rs)
#           [,1]  [,2]      [,3]      [,4]      [,5]      [,6]      [,7]      [,8]
# [1,] 1.0000000 0.637 0.5533333 0.4180000 0.5550000 0.5678947 0.4781481 0.3675000
# [2,] 0.6370000 1.000 0.2440000 0.2900000 0.4840000 0.3500000 0.4750000 0.5700000
# [3,] 0.5533333 0.244 1.0000000 0.2933333 0.5100000 0.3300000 0.4775000 0.5765714
# [4,] 0.4180000 0.290 0.2933333 1.0000000 0.4627778 0.5212121 0.5569565 0.4928571
# [5,] 0.5550000 0.484 0.5100000 0.4627778 1.0000000 0.4695652 0.5140625 0.5313793
# [6,] 0.5678947 0.350 0.3300000 0.5212121 0.4695652 1.0000000 0.5194118 0.5258333
# [7,] 0.4781481 0.475 0.4775000 0.5569565 0.5140625 0.5194118 1.0000000 0.4240000
# [8,] 0.3675000 0.570 0.5765714 0.4928571 0.5313793 0.5258333 0.4240000 1.0000000

无论出于何种原因,您的系数中并不存在所有组合;至少缺少L2DA.L2R个组合:

nms <- unique(unlist(strsplit(names(Rs), "[.]")))
nms
# [1] "L2DA" "L2DF" "L2G"  "L2L"  "L2M"  "L2P"  "L2V"  "L2R" 
grep("L2DA", names(Rs), value=TRUE)
# [1] "L2DA.L2DF" "L2DA.L2G"  "L2DA.L2L"  "L2DA.L2M"  "L2DA.L2P"  "L2DA.L2V"  "L2R.L2DA" 
setdiff(nms, sub(".*\\.", "", grep("L2DA", names(Rs), value=TRUE)))
# [1] "L2R"

...虽然有L2R.L2DA人在场...看来,vec2mat的假设与数据并不一致.

虽然我们可能会强行匹配,但我认为这种推论步骤会使情况变得不那么清楚,即所有系数都已正确分配给行/列.

让我们自己来做,而不是vec2mat个,保留名字.

tmp <- data.frame(nm = names(Rs), R = Rs) |>
  transform(row = sub("\\..*", "", nm), col = sub(".*\\.", "", nm))
head(tmp)
#                  nm         R  row  col
# L2DA.L2DF L2DA.L2DF 0.6370000 L2DA L2DF
# L2DA.L2G   L2DA.L2G 0.5533333 L2DA  L2G
# L2DA.L2L   L2DA.L2L 0.4180000 L2DA  L2L
# L2DA.L2M   L2DA.L2M 0.5550000 L2DA  L2M
# L2DA.L2P   L2DA.L2P 0.5678947 L2DA  L2P
# L2DA.L2V   L2DA.L2V 0.4781481 L2DA  L2V
reshape2::dcast(tmp, row ~ col, value.var = "R")
#    row      L2DA      L2DF       L2G       L2L       L2M       L2P       L2V
# 1 L2DA        NA 0.6370000 0.5533333 0.4180000 0.5550000 0.5678947 0.4781481
# 2 L2DF        NA        NA 0.3675000 0.2440000 0.2900000 0.4840000 0.3500000
# 3  L2G        NA        NA        NA 0.4750000 0.5700000 0.2933333        NA
# 4  L2M        NA        NA        NA 0.5100000        NA        NA        NA
# 5  L2P        NA        NA        NA 0.3300000 0.4775000        NA        NA
# 6  L2R 0.5765714 0.4627778 0.5212121 0.5569565 0.4928571 0.4695652 0.5140625
# 7  L2V        NA        NA 0.5313793 0.5194118 0.5258333 0.4240000        NA

这并不令人惊讶,因为我们知道我们没有两个方向的配对.让我们取tmp,调换两个,然后行绑定,然后再换dcast.

tmp2 <- transform(tmp, row2 = row, row = col) |>
  transform(col = row2, row2 = NULL)
head(tmp2)
#                  nm         R  row  col
# L2DA.L2DF L2DA.L2DF 0.6370000 L2DF L2DA
# L2DA.L2G   L2DA.L2G 0.5533333  L2G L2DA
# L2DA.L2L   L2DA.L2L 0.4180000  L2L L2DA
# L2DA.L2M   L2DA.L2M 0.5550000  L2M L2DA
# L2DA.L2P   L2DA.L2P 0.5678947  L2P L2DA
# L2DA.L2V   L2DA.L2V 0.4781481  L2V L2DA
out <- rbind(tmp, tmp2) |>
  reshape2::dcast(row ~ col, value.var = "R")
out
#    row      L2DA      L2DF       L2G       L2L       L2M       L2P       L2R       L2V
# 1 L2DA        NA 0.6370000 0.5533333 0.4180000 0.5550000 0.5678947 0.5765714 0.4781481
# 2 L2DF 0.6370000        NA 0.3675000 0.2440000 0.2900000 0.4840000 0.4627778 0.3500000
# 3  L2G 0.5533333 0.3675000        NA 0.4750000 0.5700000 0.2933333 0.5212121 0.5313793
# 4  L2L 0.4180000 0.2440000 0.4750000        NA 0.5100000 0.3300000 0.5569565 0.5194118
# 5  L2M 0.5550000 0.2900000 0.5700000 0.5100000        NA 0.4775000 0.4928571 0.5258333
# 6  L2P 0.5678947 0.4840000 0.2933333 0.3300000 0.4775000        NA 0.4695652 0.4240000
# 7  L2R 0.5765714 0.4627778 0.5212121 0.5569565 0.4928571 0.4695652        NA 0.5140625
# 8  L2V 0.4781481 0.3500000 0.5313793 0.5194118 0.5258333 0.4240000 0.5140625        NA

如果您需要一个简单的矩阵,那么我们可以这样做:

out2 <- as.matrix(out[,-1])
dimnames(out2) <- list(out$row, colnames(out)[-1])
out2
#           L2DA      L2DF       L2G       L2L       L2M       L2P       L2R       L2V
# L2DA        NA 0.6370000 0.5533333 0.4180000 0.5550000 0.5678947 0.5765714 0.4781481
# L2DF 0.6370000        NA 0.3675000 0.2440000 0.2900000 0.4840000 0.4627778 0.3500000
# L2G  0.5533333 0.3675000        NA 0.4750000 0.5700000 0.2933333 0.5212121 0.5313793
# L2L  0.4180000 0.2440000 0.4750000        NA 0.5100000 0.3300000 0.5569565 0.5194118
# L2M  0.5550000 0.2900000 0.5700000 0.5100000        NA 0.4775000 0.4928571 0.5258333
# L2P  0.5678947 0.4840000 0.2933333 0.3300000 0.4775000        NA 0.4695652 0.4240000
# L2R  0.5765714 0.4627778 0.5212121 0.5569565 0.4928571 0.4695652        NA 0.5140625
# L2V  0.4781481 0.3500000 0.5313793 0.5194118 0.5258333 0.4240000 0.5140625        NA

diag(out2) <- 1
out2
#           L2DA      L2DF       L2G       L2L       L2M       L2P       L2R       L2V
# L2DA 1.0000000 0.6370000 0.5533333 0.4180000 0.5550000 0.5678947 0.5765714 0.4781481
# L2DF 0.6370000 1.0000000 0.3675000 0.2440000 0.2900000 0.4840000 0.4627778 0.3500000
# L2G  0.5533333 0.3675000 1.0000000 0.4750000 0.5700000 0.2933333 0.5212121 0.5313793
# L2L  0.4180000 0.2440000 0.4750000 1.0000000 0.5100000 0.3300000 0.5569565 0.5194118
# L2M  0.5550000 0.2900000 0.5700000 0.5100000 1.0000000 0.4775000 0.4928571 0.5258333
# L2P  0.5678947 0.4840000 0.2933333 0.3300000 0.4775000 1.0000000 0.4695652 0.4240000
# L2R  0.5765714 0.4627778 0.5212121 0.5569565 0.4928571 0.4695652 1.0000000 0.5140625
# L2V  0.4781481 0.3500000 0.5313793 0.5194118 0.5258333 0.4240000 0.5140625 1.0000000

作为一项功能:

myfun <- function(Rs) {
  tmp <- data.frame(nm = names(Rs), R = Rs) |>
    transform(row = sub("\\..*", "", nm), col = sub(".*\\.", "", nm))
  tmp2 <- transform(tmp, row2 = row, row = col) |>
    transform(col = row2, row2 = NULL)
  out <- rbind(tmp, tmp2) |>
    tidyr::pivot_wider(id_cols = "row", names_from = "col", values_from = "R")
  out <- out[order(match(out$row, colnames(out))),]
  out2 <- as.matrix(out[,-1])
  dimnames(out2) <- list(out$row, colnames(out)[-1])
  diag(out2) <- 1
  out2
}
Rs
# L2DA.L2DF  L2DA.L2G  L2DA.L2L  L2DA.L2M  L2DA.L2P  L2DA.L2V  L2DF.L2G  L2DF.L2L  L2DF.L2M  L2DF.L2P  L2DF.L2V   L2G.L2L   L2G.L2M   L2G.L2P   L2M.L2L 
# 0.6370000 0.5533333 0.4180000 0.5550000 0.5678947 0.4781481 0.3675000 0.2440000 0.2900000 0.4840000 0.3500000 0.4750000 0.5700000 0.2933333 0.5100000 
#   L2P.L2L   L2P.L2M  L2R.L2DA  L2R.L2DF   L2R.L2G   L2R.L2L   L2R.L2M   L2R.L2P   L2R.L2V   L2V.L2G   L2V.L2L   L2V.L2M   L2V.L2P 
# 0.3300000 0.4775000 0.5765714 0.4627778 0.5212121 0.5569565 0.4928571 0.4695652 0.5140625 0.5313793 0.5194118 0.5258333 0.4240000 
myfun(Rs)
#           L2DF       L2G       L2L       L2M       L2P       L2V      L2DA       L2R
# L2DF 1.0000000 0.3675000 0.2440000 0.2900000 0.4840000 0.3500000 0.6370000 0.4627778
# L2G  0.3675000 1.0000000 0.4750000 0.5700000 0.2933333 0.5313793 0.5533333 0.5212121
# L2L  0.2440000 0.4750000 1.0000000 0.5100000 0.3300000 0.5194118 0.4180000 0.5569565
# L2M  0.2900000 0.5700000 0.5100000 1.0000000 0.4775000 0.5258333 0.5550000 0.4928571
# L2P  0.4840000 0.2933333 0.3300000 0.4775000 1.0000000 0.4240000 0.5678947 0.4695652
# L2V  0.3500000 0.5313793 0.5194118 0.5258333 0.4240000 1.0000000 0.4781481 0.5140625
# L2DA 0.6370000 0.5533333 0.4180000 0.5550000 0.5678947 0.4781481 1.0000000 0.5765714
# L2R  0.4627778 0.5212121 0.5569565 0.4928571 0.4695652 0.5140625 0.5765714 1.0000000

R相关问答推荐

使用geom_rect的带有事件注释的时间序列图

pivot_longer:names_to和names_pattern

如何判断R中一列的值是否在所有其他列中重复?

在通过最大似然估计将ODE模型与数据匹配时,为什么要匹配实际参数的转换值?

Tidyverse/Djirr为从嵌套列表中提取的列名赋值的解决方案

为什么st_join(ob1,ob2,left = True)返回具有比ob1更多功能的sf对象?

更改编号列表的 colored颜色

从R导出全局环境中的所有sf(numrames)对象

筛选出以特定顺序患病的个体

错误:非常长的R行中出现意外符号

从BRM预测价值

KM估计的差异:SvyKm与带权重的调查

按组计算列中1出现的间隔年数

R:如果为NA,则根据条件,使用列名模式将缺少的值替换为另一列中的值

R -使用矩阵reshape 列表

如何为混合模型输出绘制不同的线型?

访问数据帧中未定义的列时出现R错误

如何在R中创建条形图,使条形图在y轴上围绕0.5而不是0构建条形图?

名字的模糊匹配

在ggplot2图表中通过端点连接点