R语言中转置dataframe后列变为字符类型如何转回数值
问题根源
R内置的t()转置函数处理数据框时,会先将数据框转换为矩阵,而矩阵要求所有元素类型统一,只要原数据框中存在任意非数值内容(常见为将样本ID列存为普通数据列而非行名),所有元素会被强制转换为字符型,转置后再转回数据框自然全为字符类型。
另外直接对数据框整体调用as.numeric()属于错误用法:该操作会将数据框的所有元素拉平为一维数值向量,所以你会得到维度异常的结果。
可行解决方案
方案1:导入时正确配置行名后转置
如果原始Excel第一列为样本标识,导入时直接将其设置为行名,保证数据框内所有数据列均为纯数值:
library(readxl) library(tibble) # 导入Excel,将第一列设为行名 Old_data <- read_excel("data.xlsx") %>% column_to_rownames(var = 1) # 转置后直接转为数据框,所有列自动保留数值类型 New_data <- as.data.frame(t(Old_data))
方案2:转置后批量转换列类型
如果已完成导入不想重复处理导入流程,可对转置后的数据框批量转换数值类型:
library(dplyr) # 先完成转置 New_data <- as.data.frame(t(Old_data)) # 对所有可安全转换为数值的列做类型转换,自动跳过非数值的标识列 New_data <- New_data %>% mutate(across(where(~all(!is.na(as.numeric(.x)))), as.numeric))
方案3:用长宽转换替代t()转置
用tidyr的长宽转换逻辑实现转置,不会触发全表类型强制转换:
library(tidyr) library(tibble) New_data <- Old_data %>% rownames_to_column("sample_id") %>% pivot_longer(-sample_id) %>% pivot_wider(names_from = sample_id, values_from = value)
校验方法
执行str(New_data)即可查看每列的数据类型,确认转换是否符合预期。
内容的提问来源于stack exchange,提问作者Reda
相关产品推荐
相关产品推荐

