R语言按DECL_PERIO筛选多表合并仅首个筛选生效问题
错误原因
你的代码误用了as.data.frame()的传参规则:该函数仅会将第一个传入的对象转换为数据框结构,后续传入的3个筛选结果会被识别为行名、字符串配置等非数据内容参数,不会参与行拼接,因此最终结果仅保留第一个表的筛选数据。
正确实现代码
你已经确认4个表列名完全一致,直接使用dplyr包的bind_rows()做按行合并即可,一次运行就能得到筛选后的总表。同时可以用%in%运算符优化多值匹配的筛选逻辑,避免反复写|和==的冗余代码:
library(dplyr) Terra_data <- bind_rows( Terr_data_HM90 %>% filter(DECL_PERIO %in% c("1901-1950", "1951-2000", "2001-2010", "2011-2015")), Terr_data_HM14 %>% filter(DECL_PERIO %in% c("2016", "2017")), Terr_data_HM18 %>% filter(DECL_PERIO %in% c("2018", "2019")), Terr_data_HM20 %>% filter(DECL_PERIO %in% c("2020", "2021")) )
可选替代方案
如果不想依赖dplyr包,也可以用R基础函数实现,逻辑是先把4个筛选后的表存入列表,再调用do.call()批量执行行绑定:
Terra_data <- do.call( rbind, list( Terr_data_HM90[Terr_data_HM90$DECL_PERIO %in% c("1901-1950", "1951-2000", "2001-2010", "2011-2015"), ], Terr_data_HM14[Terr_data_HM14$DECL_PERIO %in% c("2016", "2017"), ], Terr_data_HM18[Terr_data_HM18$DECL_PERIO %in% c("2018", "2019"), ], Terr_data_HM20[Terr_data_HM20$DECL_PERIO %in% c("2020", "2021"), ] ) )
注意:基础
rbind()对列类型一致性要求更严格,如果不同表同名列的存储类型(比如字符/因子)不一致会直接报错,bind_rows()会自动做类型兼容适配,更适合多表合并场景。
内容的提问来源于stack exchange,提问作者Shae11
相关产品推荐
相关产品推荐

