为什么转置功能会将数字更改为R中的字符?

Mor*_*sen 8 transpose r value-class

我在Excel中构建了一个简单的矩阵,其中包含一些字符值和一些数值(在Excel中设置的数据截图).我使用openxlsx包将其读入R中,如下所示:

library(openxlsx)
data <- read.xlsx('~desktop/data.xlsx)
Run Code Online (Sandbox Code Playgroud)

之后我检查了课程:

sapply(data, class)
         x1         a         b          c
"character" "numeric" "numeric"  "numeric"
Run Code Online (Sandbox Code Playgroud)

这正是我想要的.当我尝试转置矩阵,然后再次检查类时,我的问题出现了:

data <- t(data)
Run Code Online (Sandbox Code Playgroud)

当我现在检查sapply时,所有值都是"character".为什么在移调时不保留类?

Art*_*Art 5

首先,由于用逗号分隔数字的单元格显示为字符,因此在阅读电子表格时没有得到您的结果。

data <- read.xlsx("data.xlsx")
data
#  X1   a b   c
#1  x 0,1 3 4,5
#2  y 2,4 0 6,5
#3  z  24 0   0
sapply(data,class)
#         X1           a           b           c 
#"character" "character"   "numeric" "character" 
Run Code Online (Sandbox Code Playgroud)

但是,您真正看到的问题是,通过转置数据框,您在同一列中混合了类型,因此必须将整个列转换为最广泛的通用类型,在这种情况下就是字符。

mydata<-data.frame(X1=c("x","y","z"),a=c(1,2,24),b=c(3,0,0),c=c(4,6,0),stringsAsFactors = FALSE)
sapply(mydata,class)
#         X1           a           b           c 
#"character"   "numeric"   "numeric"   "numeric" 
# what you showed
t(mydata)
#   [,1] [,2] [,3]
#X1 "x"  "y"  "z" 
#a  " 1" " 2" "24"
#b  "3"  "0"  "0" 
#c  "4"  "6"  "0" 

mydata_t<-t(mydata)
sapply(mydata_t,class)
#          x           1           3           4           y           2           #0           6           z          24 
#"character" "character" "character" "character" "character" "character" #"character" "character" "character" "character" 
#          0           0 
#"character" "character" 
Run Code Online (Sandbox Code Playgroud)

您是否要处理转置矩阵中的数字,然后再转回它们?如果是这样,请转置暂时删除了字符列的子矩阵,然后稍后重新组装,如下所示:

sub_matrix<-t(mydata[,-1])
sub_matrix
#  [,1] [,2] [,3]
#a    1    2   24
#b    3    0    0
#c    4    6    0
sub_matrix2<-sub_matrix*2
sub_matrix2
#  [,1] [,2] [,3]
#a    2    4   48
#b    6    0    0
#c    8   12    0
cbind(X1=mydata[,1],as.data.frame(t(sub_matrix2)))
#  X1  a b  c
#1  x  2 6  8
#2  y  4 0 12
#3  z 48 0  0
Run Code Online (Sandbox Code Playgroud)