R读取CSV生成数据框时数值无法识别导致行求和报错求助
错误根源
你的MSBees.spp第一列X是存储样点名称的字符型列,调用apply(MSBees.spp, 1, sum)时,R会把包含字符列的整行强制转换为字符矩阵,求和时自然触发类型不匹配的报错。从你给出的str()输出可以看到,除第一列外其余物种丰度列本身已经是数值型,不需要额外做类型转换。
解决方案
方案1:读取数据时直接将样点列设为行名(推荐,适配后续NMDS分析)
vegan包的NMDS分析要求输入的物种矩阵为纯数值结构,行对应样点、列对应物种,读取时直接设置行名刚好符合这个要求:
# 读取CSV时指定第一列为行名,得到的 data.frame 全为数值列 MSBees.spp <- read.csv("data_transposed.csv", header = TRUE, row.names = 1) # 直接用rowSums计算行和,比apply效率更高、语法更简洁 sum.of.rows <- rowSums(MSBees.spp)
后续做NMDS可以直接用这个矩阵:
library(vegan) # 示例:用 Bray-Curtis 距离做NMDS排序 nmds_res <- metaMDS(MSBees.spp, distance = "bray", trymax = 100)
方案2:不修改行名,求和时排除字符列
如果需要保留样点名称为单独一列,计算行和时排除第一列即可:
# 排除第一列字符列后计算行和 sum.of.rows <- rowSums(MSBees.spp[, -1])
之前转换方法的错误说明
as.numeric(MSBees.spp):as.numeric()只能处理向量,直接作用于整个数据框会返回无效结果lapply(MSBees.spp [2:9, 2:29], as.numeric):你筛选了第2到9行而非全部行,且除第一列外其余列本身已经是数值型,完全不需要额外转换
内容的提问来源于stack exchange,提问作者Abby L
相关产品推荐
相关产品推荐

