为什么转置函数会在 R 中将数字更改为字符?
Why does the transpose function change numeric to character in R?
我在 Excel 中构造了一个简单的矩阵,其中包含一些字符值和一些数值 (Screenshot of data as set up in Excel)。我像这样使用 openxlsx 包将它读入 R:
library(openxlsx)
data <- read.xlsx('~desktop/data.xlsx)
之后我检查 class:
sapply(data, class)
x1 a b c
"character" "numeric" "numeric" "numeric"
这正是我想要的。当我尝试转置矩阵,然后再次检查 class 时出现问题:
data <- t(data)
当我现在检查 sapply 时,所有值都是 "character"。为什么转置时 classes 没有保留?
首先,当我阅读你的电子表格时,我没有得到你的结果,因为用逗号分隔数字的单元格显示为字符。
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"
但您真正看到的问题是,通过转置数据框,您在同一列中混合了类型,因此 R 必须将整列转换为最广泛的通用类型,在本例中为字符。
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"
你想处理转置矩阵中的数字然后转置回去吗?如果是这样,转置一个暂时删除字符列的子矩阵,然后重新组合,如下所示:
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
我在 Excel 中构造了一个简单的矩阵,其中包含一些字符值和一些数值 (Screenshot of data as set up in Excel)。我像这样使用 openxlsx 包将它读入 R:
library(openxlsx)
data <- read.xlsx('~desktop/data.xlsx)
之后我检查 class:
sapply(data, class)
x1 a b c
"character" "numeric" "numeric" "numeric"
这正是我想要的。当我尝试转置矩阵,然后再次检查 class 时出现问题:
data <- t(data)
当我现在检查 sapply 时,所有值都是 "character"。为什么转置时 classes 没有保留?
首先,当我阅读你的电子表格时,我没有得到你的结果,因为用逗号分隔数字的单元格显示为字符。
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"
但您真正看到的问题是,通过转置数据框,您在同一列中混合了类型,因此 R 必须将整列转换为最广泛的通用类型,在本例中为字符。
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"
你想处理转置矩阵中的数字然后转置回去吗?如果是这样,转置一个暂时删除字符列的子矩阵,然后重新组合,如下所示:
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