R语言使用filter按row.names筛选数据集报错的解决方法
问题原因
dplyr::filter()的筛选逻辑是针对数据框内部的列做条件判断,row.names是数据框的行名属性,不属于数据框的内置列,且默认行名存储为字符类型,直接写row.names > 3既无法定位到计算对象,也会因数据类型不匹配触发报错。
可行解决方案
方法1:使用slice()按行位置筛选(推荐,适配大体量数据集)
slice()是dplyr专门用于按行位置筛选的函数,无需构造辅助列,执行效率高,直接传入要保留的行位置范围即可:
library(dplyr) temp <- data.frame(Text = c("a","b","c","d","e")) a <- temp %>% slice(4:n())
其中n()会自动识别管道传入数据框的总行数,不需要手动硬编码数据规模,适配大体量数据集场景。
运行后得到的结果和预期完全一致:
Text 4 d 5 e
方法2:在filter中显式调用行属性做判断
如果需要在filter逻辑中结合其他列条件做联合筛选,可以显式取数据框的行属性转成数值后判断,注意要用.指代当前管道传入的数据框:
a <- temp %>% filter(as.numeric(rownames(.)) > 3)
也可以先构造连续行号的辅助列再筛选,适合后续需要反复调用行标识的场景:
a <- temp %>% mutate(row_id = row_number()) %>% filter(row_id > 3) %>% select(-row_id) # 筛选完成后可删除不需要的辅助列
注意:不要直接对字符类型的行名做大小比较,否则会出现类似
"10" < "3"的字符排序逻辑错误,导致筛选结果不符合预期。
内容的提问来源于stack exchange,提问作者Aravindan Kalai
相关产品推荐
相关产品推荐

