如何在R的sf对象数据框中筛选出列为空列表的行?
解决SF对象中筛选空列表列的行的问题
问题原因分析
你之前尝试的方法失效的原因:
identical(a, neighborhood):neighborhood是列表列,你用单个空字符向量和整个列比较,整体不可能完全一致,返回全FALSE。is_empty(neighborhood):sf包的is_empty()默认是检查geometry列的几何对象是否为空,不是用来判断列表长度的。length(neighborhood[[1]])==0:只检查了第一行的列表长度,这个单一布尔值会被循环应用到所有行,如果第一行不是空列表,所有行都会被排除。is.na(neighborhood):空列表不属于NA值,所以这个判断不生效。
正确筛选方法
1. Base R 方法
用sapply()逐行检查每个列表元素的长度是否为0,生成逻辑向量后筛选:
# 筛选neighborhood列为空列表的行 dt_filtered <- dt[sapply(dt$neighborhood, function(x) length(x) == 0), ]
2. tidyverse 方法
如果使用dplyr和purrr,可以更简洁地逐行判断:
library(dplyr) library(purrr) dt_filtered <- dt %>% filter(map_lgl(neighborhood, ~ length(.x) == 0))
验证示例
可以先构造一个模拟的sf数据框测试:
library(sf) # 构造测试数据 dt <- st_sf( POP20 = c(1000, 2000, 3000), neighborhood = list(c("A"), character(0), c("B", "C")), geometry = st_sfc(st_point(c(1,2)), st_point(c(3,4)), st_point(c(5,6))), crs = 4326 ) # 筛选空列表行 dt_filtered <- dt[sapply(dt$neighborhood, function(x) length(x) == 0), ]
运行后会得到第二行(neighborhood为空列表)的结果。
内容的提问来源于stack exchange,提问作者BLP92
相关产品推荐
相关产品推荐

