首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过匹配r中的映射结构来修改字符变量

通过匹配r中的映射结构来修改字符变量
EN

Stack Overflow用户
提问于 2021-12-10 18:32:51
回答 1查看 87关注 0票数 1

我需要修改一个字符变量基于映射数据帧嵌入对角线序号。

这是我的三个矩阵的样子。

代码语言:javascript
运行
复制
# 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.1inds.2inds.3存储每个矩阵的Free序号。注意,Free的第一个订单是0。这就是为什么第二个Free的订单号为2而不是3。第三个Free有一个5的订单号,等等。

代码语言:javascript
运行
复制
# 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

这张地图显示哪一项属于哪一组。

基于这些信息,我能够创建一个输出,但需要对此进行一些修改。

代码语言:javascript
运行
复制
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]);"   

在这个输出中要修改两件事。

  1. 用逗号删除数字(所以11,12,等)。需要删除。对于输出中的每一行,都需要编辑
  2. ,以指示匹配的矩阵序号。例如,在映射中,Item=12位于G1G3中,在第1组中,矩阵序号是来自inds.1对象的5。在第2组中,矩阵序号为来自2inds.1对象的Item=12。我需要把这些数字嵌入到[X}.

预期的产出将是:

代码语言:javascript
运行
复制
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]);

有什么想法吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-10 20:54:33

也许这会有帮助-

用“inds”objects

  • Reshape的相应值转换为长格式-pivot_longer

  • Remove的行,其中“值”列为0--从“名称”列-str_remove

  • Create中的子字符串--从“名称”、“值”--按“项”表示的新格式化列,“新”列-str_c

  • Extract列为向量-pull

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
[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]);"    
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70308986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档