如何筛选DataFrame中所有列均无'Unknown'值的行?
筛选DataFrame中所有列均无'Unknown'值的行
示例数据
先构造你提供的示例DataFrame:
mydf <- data.frame( name = c("Dave", "John", "Steve", "Mark"), age = c("54", "Unknown", "34", "38"), height = c("180", "Unknown", "182", "178"), job = c("Y", "Unknown", "Y", "Y"), city = c("London", "Unknown", "Birmingham", "Unknown"), stringsAsFactors = FALSE )
解决方案
下面提供几种实用的实现方法:
方法1:Base R + apply + all
你之前用all出错是因为没按行维度应用函数,正确写法如下:
mynewdf <- mydf[apply(mydf != "Unknown", 1, all), ]
mydf != "Unknown"生成布尔矩阵,标记每个元素是否非'Unknown'apply(..., 1, all)按行(参数1代表行)执行all函数,判断该行所有元素是否都为TRUE- 最后用生成的布尔向量对原DataFrame做子集筛选
方法2:Base R + rowSums(更高效)
针对大数据集,用rowSums统计每行的'Unknown'数量,筛选数量为0的行性能更好:
mynewdf <- mydf[rowSums(mydf == "Unknown") == 0, ]
rowSums(mydf == "Unknown")统计每行中'Unknown'的个数- 筛选个数为0的行,就是所有列都无'Unknown'的目标行
方法3:tidyverse(dplyr)
如果习惯用dplyr,可以用if_all函数简洁实现:
library(dplyr) mynewdf <- mydf %>% filter(if_all(everything(), ~ . != "Unknown"))
everything()指定检查所有列if_all(..., ~ . != "Unknown")确保所有列都满足非'Unknown'的条件filter保留符合条件的行
最终结果
执行任意方法后,得到的mynewdf如下:
> mynewdf name age height job city 1 Dave 54 180 Y London 3 Steve 34 182 Y Birmingham
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

