R语言栅格多边形对应列表的频率表生成及报错问题求助
嘿,我明白你为啥用apply()的时候会触发那个dim(X)的报错啦!apply()是给矩阵、数据框这种有明确行/列维度的对象设计的,而你的v.1是个列表,根本没有“列”这个维度,自然会出问题。咱们换用列表专属的工具来搞定每个多边形的栅格值频率统计,给你两种实用方案:
方案一:Base R 原生实现
1. 逐个生成带补全的频率表
先用lapply()遍历列表里的每个元素,统计频率的同时,把0-16所有可能的取值都补全(避免有的多边形里没出现某个值,导致结果缺项):
freq_list <- lapply(v.1, function(x) { # 先统计当前元素的频率 raw_tab <- table(x) # 把0到16的所有值都纳入,没出现的就填0 full_counts <- as.integer(raw_tab[as.character(0:16)]) # 给每个计数贴上对应的数值标签 names(full_counts) <- 0:16 full_counts })
2. 合并成整齐的数据框
如果想把所有多边形的结果整合成一个表格,用do.call(rbind, ...)把列表转成数据框:
freq_df <- as.data.frame(do.call(rbind, freq_list)) # 要是你的列表有命名(比如每个元素对应多边形ID),可以给行加上名字 rownames(freq_df) <- names(v.1)
方案二:tidyverse 简洁版
如果你平时用tidyverse的工具链,代码会更直观,还能自动处理缺值补全:
library(tidyverse) freq_df <- enframe(v.1, name = "多边形ID", value = "栅格值") %>% # 把每个列表元素拆成单独的行 unnest(cols = 栅格值) %>% # 统计每个多边形里各数值的出现次数 count(多边形ID, 栅格值) %>% # 补全0-16所有值,没出现的次数填0 complete(多边形ID, 栅格值 = 0:16, fill = list(n = 0)) %>% # 转成宽格式,方便查看 pivot_wider(names_from = 栅格值, values_from = n)
为啥之前的apply会报错?
Error in apply(x, 2, table) : dim(X) must have a positive length
这个报错的核心就是apply()要求输入对象有明确的维度(比如矩阵的行/列数),但列表是一维结构,没有“列”这个维度参数,所以你指定2(按列处理)的时候就会触发错误。而lapply()和sapply()是专门为列表设计的遍历函数,会逐个处理每个列表元素,完全适配你的需求~
内容的提问来源于stack exchange,提问作者ecologist1234
相关产品推荐
相关产品推荐

