R语言索引含0时用[-c(),]取dataframe子集输出0行如何解决
问题根因
R的向量/数据框索引遵循如下规则:
- 正整数代表选中对应位置的元素/行,负整数代表排除对应位置的元素/行
- 单独的0值(包括
-0,因为R中-0和0完全等价)作为索引时,会返回空子集 - 当索引向量同时包含0和其他有效值时,0会被自动忽略,仅执行有效值的索引逻辑
你遇到的现象正好匹配这个规则:
del_folder = c(0,3)时,0被忽略,仅排除第3行,符合预期del_folder = c(0)时,等价于用0做索引,返回0行数据,不符合预期
解决方法
方案1:预处理索引+逻辑判断(基础R语法兼容)
先过滤掉del_folder中的无效0值,再判断是否有需要删除的行:
del_folder<-c(0) # 过滤出有效的正整数索引 to_remove <- del_folder[del_folder > 0] # 无待删除行则返回原数据,否则排除对应行 df1 %>% {if(length(to_remove) == 0) . else .[-to_remove, ]}
方案2:用dplyr的slice函数(更简洁无歧义)
dplyr的slice函数已经兼容了空删除索引的场景,不需要额外判断:
library(dplyr) del_folder<-c(0) to_remove <- del_folder[del_folder > 0] df1 %>% slice(-all_of(to_remove))
内容的提问来源于stack exchange,提问作者kittygirl
相关产品推荐
相关产品推荐

