如何修复R FieldSpectra程序运行时cbind函数的行长度不匹配警告
cbind行数不匹配警告的排查与解决
这个警告出现的本质是你准备合并的两个对象plotnames和m的长度/行数不一致,R的cbind函数遇到长度不等的向量合并时,会把短向量的元素循环重复补齐到和长向量一致的长度,这就是触发警告的原因。这种自动补齐会最终导致你生成的specindices表出现行错位,是完全不可用的,必须修正后再合并。
第一步:先核对两个待合并对象的长度
因为m是由多个光谱指数向量合并成的矩阵/数据框,用nrow()查询行数;plotnames是从spectra取出的第一列向量,用length()查询元素总个数,运行以下代码:
# 查看m的总行数 nrow(m) # 查看plotnames的总元素数 length(plotnames)
两个数值不相等就说明确实是长度不匹配导致的警告。
第二步:定位长度不匹配的具体原因
根据核对结果,对应两种常见的场景排查:
- 场景1:
m的行数小于plotnames的长度
这种情况基本是你在计算前面那组光谱指数(CF_690、NDVI等)的过程中,通过过滤、na.omit()等操作删掉了部分无效观测行,但取样方名称的时候还是用了原始全量的spectra[,1],没有同步匹配过滤后的观测行。
解决方法:找你之前计算光谱指数时用到的行过滤规则,给plotnames应用完全相同的过滤逻辑。比如你之前算指数时只保留了spectra里第1、2、4、6到最后一行的有效观测,那取样方名就要写:
不能直接取全量的第一列。plotnames = spectra[c(1,2,4,6:nrow(spectra)), 1] - 场景2:
plotnames的长度小于m的行数
这种情况说明组成m的9个光谱指数向量里,有个别向量的长度和其他的不一致,导致最终拼出来的m行数被长的那个向量拉高了。可以运行以下代码挨个核查每个指数向量的长度:
找到长度不对的那个向量,回到它的生成代码里排查错误——比如是不是取对应波长的光谱列时索引写错,多取了/漏取了数值,修正到所有指数向量长度一致,再重新生成# 把所有生成的光谱指数放到列表里批量查长度 check_list = list(CF_690, CF_740, Chl_a_b, NDVI, NDWI, PRI, PRI2, SR, WBI) names(check_list) = c("CF_690", "CF_740", "Chl_a_b", "NDVI", "NDWI", "PRI", "PRI2", "SR", "WBI") lapply(check_list, length)m。
第三步:重新合并生成最终表
等nrow(m)和length(plotnames)的数值完全相等之后,再运行合并代码:
specindices = cbind(plotnames, m)
这时候就不会再出现警告,生成的表格也不会出现行错位的问题。
内容的提问来源于stack exchange,提问作者RubiscoActivase
相关产品推荐
相关产品推荐

