我有一个5x5协方差矩阵如下:
unique.items <- c(1,2,3,4)
diag <- rep("Free",length(unique.items)+1)
offdiag <- rep("0.0", (length(unique.items)+1)*length(unique.items)/2 )
m <- matrix(NA, ncol = length(diag), nrow = length(diag))
m[lower.tri(m)] <- offdiag
m[upper.tri(m)] <- t(m)[upper.tri(t(m))]
diag(m) <- diag
> m
[,1] [,2] [,3] [,4] [,5]
[1,] "Free" "0.0" "0.0" "0.0" "0.0"
[2,] "0.0" "Free" "0.0" "0.0" "0.0"
[3,] "0.0" "0.0" "Free" "0.0" "0.0"
[4,] "0.0" "0.0" "0.0" "Free" "0.0"
[5,] "0.0" "0.0" "0.0" "0.0" "Free"
然后,我得到了下面的三角形:
lower.triangle <- paste(tapply(m[lower.tri(m, diag = TRUE)],
row(m)[lower.tri(m, diag = TRUE)], FUN = toString),
collapse=",")
> lower.triangle
"Free,
0.0, Free,
0.0, 0.0, Free,
0.0, 0.0, 0.0, Free,
0.0, 0.0, 0.0, 0.0, Free"
我需要生成一个字符变量,包括如下所示的分组变量。
group <- c(1,2,3,4)
期望输出
"Equal = (G4, Covariance[2]), (G1, Covariance[2]), (G2, Covariance[2]), (G3, Covariance[2]);
Equal = (G4, Covariance[5]), (G1, Covariance[5]), (G2, Covariance[5]), (G3, Covariance[5]);
Equal = (G4, Covariance[9]), (G1, Covariance[9]), (G2, Covariance[9]), (G3, Covariance[9]);
Equal = (G4, Covariance[14]), (G1, Covariance[14]), (G2, Covariance[14]), (G3, Covariance[14]);"
G1、G2、G3和G4用于分组。Covariance[#]
中的数字是矩阵下三角形中对角元素的阶数。
Free
)元素的顺序是lower.triangle
对象中的0
。第三个元素的( 0
.Covariance[#]
.开头,对角线元素的序号为2,5,9,14,需要在Covariance[#]
.中
任何帮助都是非常感谢的。谢谢!
发布于 2020-09-03 03:44:56
将上三角矩阵设置为NA
,得到'Free'
值在m
中的索引,忽略NA
值。使用该索引生成要使用paste0
和sprintf
的文本。
group <- c(4,1:3)
m[upper.tri(m)] <- NA
inds <- which(na.omit(c(t(m))) == 'Free')[-1] - 1
#first -1 because you want to ignore first 'Free' and
#second -1 because indexing start from 0 in your case.
inds
#[1] 2 5 9 14
sapply(inds, function(x)paste0('Equal = ',
paste0(sprintf('(G%d, Covariance[%d])', group, x), collapse = " , ")))
#[1] "Equal = (G4, Covariance[2]) , (G1, Covariance[2]) , (G2, Covariance[2]) , (G3, Covariance[2])"
#[2] "Equal = (G4, Covariance[5]) , (G1, Covariance[5]) , (G2, Covariance[5]) , (G3, Covariance[5])"
#[3] "Equal = (G4, Covariance[9]) , (G1, Covariance[9]) , (G2, Covariance[9]) , (G3, Covariance[9])"
#[4] "Equal = (G4, Covariance[14]) , (G1, Covariance[14]) , (G2, Covariance[14]) , (G3, Covariance[14])"
发布于 2020-09-02 23:44:47
上面的数据语句生成了一个6x6矩阵,所以我将其编辑为5x5,以复制上面的内容。然后,通过使用上三角形,实际上更容易找到自由元素的序号。
unique.items <- c(1,2,3,4,5)
diag <- rep("Free",length(unique.items))
offdiag <- rep("0.0", (length(unique.items)-1)*length(unique.items)/2 )
m <- matrix(NA, ncol = length(diag), nrow = length(diag))
m[lower.tri(m)] <- offdiag
m[upper.tri(m)] <- t(m)[upper.tri(t(m))]
diag(m) <- diag
由于您不需要第一个元素,所以我们可以执行以下操作:
ut <- m[,-1][upper.tri(m, diag=TRUE)[,-1]]
ut
# [1] "0.0" "Free" "0.0" "0.0" "Free" "0.0" "0.0" "0.0" "Free" "0.0" "0.0" "0.0"
# [13] "0.0" "Free"
这将从m
中移除第一列,然后找到m
的上三角形,但将输出的第一列切断。接下来,只需找出哪些观测是"Free"
,而这些是我们称之为inds
的序号。
inds <- which(ut == "Free")
然后,我们可以定义group
变量。我们还可以定义每个字符串的两部分--组和协方差语句。
group <- c(1,2,3,4)
eg <- expand.grid(group = paste0("G", group), cov=paste0(" Covariance[", inds, "]"))
head(eg)
# group cov
# 1 G1 Covariance[2]
# 2 G2 Covariance[2]
# 3 G3 Covariance[2]
# 4 G4 Covariance[2]
# 5 G1 Covariance[5]
# 6 G2 Covariance[5]
接下来,我们根据cov
变量拆分数据框架,这样所有相同的协方差组都在一起。
eg <- split(eg, eg$cov)
eg
现在是一个有四个组的列表,每个协方差组一个。
现在,通过一堆粘贴语句,我们可以把所有的部分放在一起。
## collapses all of the pasted statements together by a new-line character \n
out <- paste(
## does the paste functions to each element of the list
sapply(eg, function(x)
## puts Equal = and ; around the result below
paste0("Equal = ",
## pastes the (G#, covariance[#]) together and collapses by a ,
paste(
## makes (G#, covariance[#])
paste0("(", x$group, ",", x$cov, ")"),
collapse=", "),
";")
),
collapse="\n")
cat(out)
# Equal = (G1, Covariance[2]), (G2, Covariance[2]), (G3, Covariance[2]), (G4, Covariance[2]);
# Equal = (G1, Covariance[5]), (G2, Covariance[5]), (G3, Covariance[5]), (G4, Covariance[5]);
# Equal = (G1, Covariance[9]), (G2, Covariance[9]), (G3, Covariance[9]), (G4, Covariance[9]);
# Equal = (G1, Covariance[14]), (G2, Covariance[14]), (G3, Covariance[14]), (G4, Covariance[14]);
https://stackoverflow.com/questions/63713925
复制相似问题