我想在包含缺失值的大型数据框中显示列的名称.基本上,我想要相当于complete.cases(df)但是对于列而不是行.有些列是非数字的,所以类似于
names(df[is.na(colMeans(df))])
Run Code Online (Sandbox Code Playgroud)
返回"colMeans中的错误(df):'x'必须是数字." 因此,我目前的解决方案是转置数据框并运行complete.cases,但我猜测有一些变体(或者plyr中的某些东西)效率更高.
nacols <- function(df) {
names(df[,!complete.cases(t(df))])
}
w <- c("hello","goodbye","stuff")
x <- c(1,2,3)
y <- c(1,NA,0)
z <- c(1,0, NA)
tmp <- data.frame(w,x,y,z)
nacols(tmp)
[1] "y" "z"
Run Code Online (Sandbox Code Playgroud)
有人能告诉我一个更有效的功能来识别有NA的列吗?
Tyl*_*ker 25
这是我所知道的最快的方式:
unlist(lapply(df, function(x) any(is.na(x))))
Run Code Online (Sandbox Code Playgroud)
编辑:
我想其他人都写完了所以这里完成了:
nacols <- function(df) {
colnames(df)[unlist(lapply(df, function(x) any(is.na(x))))]
}
Run Code Online (Sandbox Code Playgroud)
如果您在WIN 7机器上对4个解决方案进行微基准测试:
Unit: microseconds
expr min lq median uq max
1 ANDRIE 85.380 91.911 106.375 116.639 863.124
2 MANOEL 87.712 93.778 105.908 118.971 8426.886
3 MOIRA 764.215 798.273 817.402 876.188 143039.632
4 TYLER 51.321 57.853 62.518 72.316 1365.136
Run Code Online (Sandbox Code Playgroud)
这是一个视觉:
编辑在我写的时候,这anyNA
不存在或者我没有意识到它.这可能moreso加快速度......每帮助手册?anyNA
:
通用功能
anyNA
实现any(is.na(x))
在一个可能更快的方法(特别是用于原子矢量).
nacols <- function(df) {
colnames(df)[unlist(lapply(df, function(x) anyNA(x)))]
}
Run Code Online (Sandbox Code Playgroud)
这是一种方式:
colnames(tmp)[colSums(is.na(tmp)) > 0]
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你,
马诺埃尔
单程...
nacols <- function(x){
y <- sapply(x, function(xx)any(is.na(xx)))
names(y[y])
}
nacols(tmp)
[1] "y" "z"
Run Code Online (Sandbox Code Playgroud)
说明:由于结果y
是逻辑向量,因此仅names(y[y])
返回y为0的情况的名称y
.
归档时间: |
|
查看次数: |
15359 次 |
最近记录: |