我需要修改一个字符变量基于映射数据帧嵌入对角线序号。
这是我的三个矩阵的样子。
# for Group 1
Group.1 <- c(11,12,13,14,15)
diag <- rep("Free",length(Group.1)+1)
offdiag <- rep("0.0", (length(Group.1)+1)*length(Group.1)/2 )
m1 <- matrix(NA, ncol = length(diag), nrow = length(diag))
m1[lower.tri(m1)] <- offdiag
m1[upper.tri(m1)] <- t(m1)[upper.tri(t(m1))]
diag(m1) <- diag
m1[upper.tri(m1)] <- NA
> m1
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "Free" NA NA NA NA NA
[2,] "0.0" "Free" NA NA NA NA
[3,] "0.0" "0.0" "Free" NA NA NA
[4,] "0.0" "0.0" "0.0" "Free" NA NA
[5,] "0.0" "0.0" "0.0" "0.0" "Free" NA
[6,] "0.0" "0.0" "0.0" "0.0" "0.0" "Free"
inds.1 <- which(na.omit(c(t(m1))) == 'Free')[-1] - 1
> inds.1
[1] 2 5 9 14 20
inds.1
、inds.2
和inds.3
存储每个矩阵的Free
序号。注意,Free
的第一个订单是0
。这就是为什么第二个Free
的订单号为2
而不是3
。第三个Free
有一个5
的订单号,等等。
# for Group 2
Group.2 <- c(11,13,15)
diag <- rep("Free",length(Group.2)+1)
offdiag <- rep("0.0", (length(Group.2)+1)*length(Group.2)/2 )
m2 <- matrix(NA, ncol = length(diag), nrow = length(diag))
m2[lower.tri(m2)] <- offdiag
m2[upper.tri(m2)] <- t(m2)[upper.tri(t(m2))]
diag(m2) <- diag
m2[upper.tri(m2)] <- NA
inds.2 <- which(na.omit(c(t(m2))) == 'Free')[-1] - 1
> inds.2
[1] 2 5 9
# for Group 3
Group.3 <- c(12,13,14)
diag <- rep("Free",length(Group.3)+1)
offdiag <- rep("0.0", (length(Group.3)+1)*length(Group.3)/2 )
m3 <- matrix(NA, ncol = length(diag), nrow = length(diag))
m3[lower.tri(m3)] <- offdiag
m3[upper.tri(m3)] <- t(m3)[upper.tri(t(m3))]
diag(m3) <- diag
m3[upper.tri(m3)] <- NA
inds.3 <- which(na.omit(c(t(m3))) == 'Free')[-1] - 1
> inds.3
[1] 2 5 9
# create grouping map
map.1 <- as.data.frame(cbind(Items=Group.1, Group.1 = 1))
map.2 <- as.data.frame(cbind(Items=Group.2, Group.2 = 1))
map.3 <- as.data.frame(cbind(Items=Group.3, Group.3 = 1))
group.map.12 <- merge(map.1, map.2, by="Items", all = TRUE)
group.map.all <- merge(group.map.12, map.3, by="Items", all = TRUE)
group.map.all[is.na(group.map.all)] <- 0
> group.map.all
Items Group.1 Group.2 Group.3
1 11 1 1 0
2 12 1 0 1
3 13 1 1 1
4 14 1 0 1
5 15 1 1 0
这张地图显示哪一项属于哪一组。
基于这些信息,我能够创建一个输出,但需要对此进行一些修改。
output <- c("Equal = (G1, 11, Covariance[X]), (G2, 11, Covariance[X]);",
"Equal = (G1, 12, Covariance[X]), (G3, 12, Covariance[X]);",
"Equal = (G1, 13, Covariance[X]), (G2, 13, Covariance[X]), (G3, 13, Covariance[X]);",
"Equal = (G1, 14, Covariance[X]), (G3, 14, Covariance[X]);",
"Equal = (G1, 15, Covariance[X]), (G2, 15, Covariance[X]);")
> output
[1] "Equal = (G1, 11, Covariance[X]), (G2, 11, Covariance[X]);"
[2] "Equal = (G1, 12, Covariance[X]), (G3, 12, Covariance[X]);"
[3] "Equal = (G1, 13, Covariance[X]), (G2, 13, Covariance[X]), (G3, 13, Covariance[X]);"
[4] "Equal = (G1, 14, Covariance[X]), (G3, 14, Covariance[X]);"
[5] "Equal = (G1, 15, Covariance[X]), (G2, 15, Covariance[X]);"
在这个输出中要修改两件事。
11,
,12,
等)。需要删除。对于输出中的每一行,都需要编辑Item=12
位于G1
和G3
中,在第1组中,矩阵序号是来自inds.1
对象的5
。在第2组中,矩阵序号为来自2
的inds.1
对象的Item=12
。我需要把这些数字嵌入到[X}
.中
预期的产出将是:
Equal=(G1,Covariance[2]),(G2,Covariance[2]);
Equal=(G1,Covariance[5]),(G2,Covariance[2]);
Equal=(G1,Covariance[9]),(G2,Covariance[5]),(G3,Covariance[5]);
Equal=(G1,Covariance[14]),(G3,Covariance[9]);
Equal=(G1,Covariance[20]),(G2,Covariance[9]);
有什么想法吗?谢谢!
发布于 2021-12-10 20:54:33
也许这会有帮助-
用“inds”objects
pivot_longer
str_remove
str_c
pull
library(stringr)
library(dplyr)
library(tidyr)
group.map.all %>%
mutate(across(starts_with('Group'),
~ replace(., as.logical(.),
get(str_replace(cur_column(), "Group", "inds"))))) %>%
pivot_longer(cols = -Items) %>%
filter(value != 0) %>%
mutate(name = str_remove(name, "[a-z.]+")) %>%
summarise(Items, new = sprintf('(%s,Covariance[%d])', name, value)) %>%
group_by(Items) %>%
summarise(new = str_c('Equal=',str_c(new, collapse=","), ";")) %>%
pull(new)
-output
[1] "Equal=(G1,Covariance[2]),(G2,Covariance[2]);"
[2] "Equal=(G1,Covariance[5]),(G3,Covariance[2]);"
[3] "Equal=(G1,Covariance[9]),(G2,Covariance[5]),(G3,Covariance[5]);"
[4] "Equal=(G1,Covariance[14]),(G3,Covariance[9]);"
[5] "Equal=(G1,Covariance[20]),(G2,Covariance[9]);"
https://stackoverflow.com/questions/70308986
复制相似问题