如何截断R矩阵的列名以便于可视化,同时保持底层完整的列名以供处理?

yvt65v4c  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(106)

我正在使用多个交互式矩阵,它们被合并到一个列表中,用于组织和Shiny渲染目的。由于生成的矩阵数量和矩阵列的数量,唯一的矩阵列名变得非常长,使得矩阵很难在R studio中查看。我需要查看由函数生成的临时矩阵以进行测试。
R pro是如何处理这类问题的呢?是否为了可视化的目的而截断矩阵的列名,同时为了处理的目的而保留长列名?或者,R pro是不是为矩阵名称和列名创建一个键索引,并分配矩阵名称,如mat1,mat2等,以及列名mat1Col1,mat1Col2等?后者对我来说似乎很难,矩阵列名更容易变得有些不言自明,即使很长。
下面发布的代码是一个编辑。实际代码中的矩阵列名比这个例子中显示的名称长得多。你可以看到矩阵被嵌入到一个列表中,长矩阵列名的一部分被提取出来并插入到列表名称中,用于嵌入矩阵标识。运行输出矩阵的函数会导致下图的上半部分,然后运行函数,输出带有嵌入矩阵的列表,结果会出现下图的下半部分:


的数据
代码:

create_Tmp1 <- function(element, variable) {

  col_1 <- paste('Begin_testing_element', element, sep = "_")
  col_2 <- paste('Run_tests_element', element, sep = "_")
  col_3 <- paste('End_testing_element', element, sep = "_")
  
  matTmp1 <- matrix(0, nrow = 3, ncol = 3)
  colnames(matTmp1) <- c(col_1,col_2,col_3)
  
  
  # For-loop to generate running table
  for(i in seq(nrow(matTmp1))){
    if(i > 1){matTmp1[i,col_1] = matTmp1[i-1,col_3]}
    matTmp1[i,col_2] = variable
    matTmp1[i,col_3] = matTmp1[i,col_1] + matTmp1[i,col_2]
  }
  
  matTmp1_to_list <- matTmp1
  new_colnames <- sub("_element.*$", "", colnames(matTmp1))
  colnames(matTmp1_to_list) <- new_colnames
  
  listTmp1 <- list(matTmp1 = list())
  listTmp1$matTmp1[[element]] <- matTmp1_to_list
  
  return(listTmp1)
  # return(matTmp1)
}

create_Tmp1("once_upon_a_time",5)

字符串

kx7yvsdv

kx7yvsdv1#

你可以为"matrix"类的对象写一个方法。这个方法可以替换列名,然后调用通常的print.default

print.matrix <- function(x, ..., size = 4L) {
  cn <- colnames(x)
  if(any(nchar(cn) > size)) {
    cn <- abbreviate(cn, minlength = size, strict = TRUE, method = "both")
    colnames(x) <- cn
  }
  NextMethod()
}

m <- matrix(1:12, 3, dimnames = list(NULL, state.name[1:4]))

print.default(m)
#>      Alabama Alaska Arizona Arkansas
#> [1,]       1      4       7       10
#> [2,]       2      5       8       11
#> [3,]       3      6       9       12

# default is size = 4L
print(m)
#>      Albm Alsk Arzn Arkn
#> [1,]    1    4    7   10
#> [2,]    2    5    8   11
#> [3,]    3    6    9   12

# size is too small, printed names are equal,
# original names do not change
print(m, size = 2L)
#>      Al Al Ar Ar
#> [1,]  1  4  7 10
#> [2,]  2  5  8 11
#> [3,]  3  6  9 12

m
#>      Albm Alsk Arzn Arkn
#> [1,]    1    4    7   10
#> [2,]    2    5    8   11
#> [3,]    3    6    9   12

字符串
创建于2023-11-01使用reprex v2.0.2

igsr9ssn

igsr9ssn2#

也许你可以使用标签(据我所知,只用于 Dataframe )。

# sample data
mymatrix <- matrix(rep(1:3, 3), ncol = 3)
colnames(mymatrix) <- paste0("My_Long_Colname", 1:3)

library(sjlabelled)
library(labelled)
# labels only wotk on vectors or data.frames, 
#  so create a data.frame from the mar
mydf <- as.data.frame(mymatrix)
# set labels to each colum (here: a,b,c are used)
mydf <- labelled::set_variable_labels(mydf, .labels = letters[1:3])
# print with labels as colnames
sjlabelled::label_to_colnames(mydf)
#   a b c
# 1 1 1 1
# 2 2 2 2
# 3 3 3 3

# proof that the actual conames are still intact:
mydf
#   My_Long_Colname1 My_Long_Colname2 My_Long_Colname3
# 1                1                1                1
# 2                2                2                2
# 3                3                3                3

字符串

相关问题