如何在不更改行数和列数的情况下从矩阵创建数据框?

问题描述

我创建了一个表格,其中结合了数字(相关性)和重要性(星号)。我想将数据转换为数据框以进行进一步处理。我尝试了tibble和as.data.frame,但都将矩阵转换为1xn帧。我显然做错了。但是呢?

R <- matrix(data=-3:2/10,ncol=3,nrow=2,byrow=TRUE)
mystars <- matrix(data=c("*  ","*  ","***","   ","** "),byrow=TRUE)
R1 <- tibble(paste(R,mystars))
R2 <- as.data.frame(paste(R,mystars),stringsAsFactors = FALSE,byrow=TRUE)

这将提供6x1的小对象和6x1的数据帧,而不是原始的2x3矩阵。

解决方法

您可以使用[]保留原始矩阵的尺寸。

R[] <- trimws(paste(R,mystars))

#       [,1]     [,2]     [,3]    
#[1,] "-0.3 *" "-0.2 *" "-0.1 *"
#[2,] "0 ***"  "0.1"    "0.2 **"
,

当您paste个数字和星号在一起时,我们将获得"character"个数据。但是,除非我们手动进行转换,否则数字将不能很好地转换(删除十进制零,负数比非负数更宽)。

r0 <- R < 0  ## store numbers less than zero
R <- formatC(R,format="f",digits=1)  ## format numbers to character
R[!r0] <- sprintf(" %s",R[!r0])  ## insert leading space for non-negative

然后,我们可以将mapplypaste0一起使用,并由于具有不错的array参数而首先转换为dim=,最后转换为as.data.frame。>

as.data.frame(array(mapply(paste0,R,mystars),dim=dim(R)))
#        V1      V2
# 1 -0.3*   -0.2*  
# 2 -0.1*    0.0***
# 3  0.1     0.2** 

数据:

R <- structure(c(-0.3,-0.1,0.1,-0.2,0.2),.Dim = 3:2)
mystars <- structure(c("*  ","*  ","   ","***","** "),.Dim = 3:2)