R语言数据框操作中数字转字符串,无法恢复数值矩阵的问题
数据框操作后数值转字符串的问题分析与解决
问题复现
你的操作步骤和现象如下:
df<-data.frame( X1=c(1,2,3), X2=c(4,5,6), X3=c(7,8,9) ) med1<-c("name1", "name2", "name3") rownames(df)<-med1 df2<-as.data.frame(cbind(t(df), species=c("inv1", "inv2", "inv3")))
操作现象:
class(df) # [1] "data.frame" class(df2) # [1] "data.frame" as.matrix(df)+1 # 正常运行 as.matrix(t(df2)[1:3,])+1 # 因数字变为字符串无法运行 as.matrix(df)==as.matrix(t(df2)[1:3,]) # 逻辑判断显示两者相同
核心原因
问题出在cbind(t(df), species=c("inv1", "inv2", "inv3"))这一步:
t(df)返回的是数值型矩阵,而species是字符向量cbind在混合不同数据类型的输入时,会自动将所有元素转换为兼容性最强的类型——也就是字符型(因为字符可以容纳数值,但数值不能容纳字符)- 转成
data.frame后,原本的数值列依然保持字符类型,所以后续转矩阵得到的是字符矩阵,无法直接进行算术运算 ==判断显示相同,是因为R在做逻辑比较时会自动隐式类型转换,把字符串转成数值后再对比,但两者的实际数据类型完全不同
解决方法
方法1:避免类型混合的构造方式(推荐)
不要用cbind混合数值矩阵和字符向量,直接用data.frame构造,这样能保留数值列的类型:
df2 <- data.frame(t(df), species = c("inv1", "inv2", "inv3"))
此时df2的前3列依然是数值型,后续提取后转矩阵可直接运算:
as.matrix(df2[,1:3]) + 1 # 正常运行
方法2:从已生成的df2中恢复数值矩阵
如果已经得到了df2,可以先将字符型列转换为数值型,再转矩阵:
# 提取目标列并转换为数值型 num_data <- sapply(df2[,1:3], as.numeric) # 转为可运算的数值矩阵 num_matrix <- as.matrix(num_data) # 测试运算 num_matrix + 1 # 正常运行
或者一步到位:
as.matrix(sapply(df2[,1:3], as.numeric)) + 1
内容的提问来源于stack exchange,提问作者Scientist
相关产品推荐
相关产品推荐

