使用包含R中不需要的值的列过滤数据框

时间:2014-01-11 18:49:25

标签: r filter indexing

我有一个包含576列的数据框,其中许多列包含-999.999。我实际上想从我的数据框中删除所有这些列,换句话说,我只想处理不包含-999.999的列。所以我使用了一个给我TRUE / FALSE的循环,虽然它的目的是让所有-999.999变成'NA':

achem<-lapply(1:length(achem), function(i) is.na(achem[[i]])<- achem[[i]]==-999.999)
> head(achem)
[[1]]
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[19] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE

... ...

[[4]]
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[22] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

[[5]]
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[19] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE

... ...

下一步是找到TRUE的列表[[i]],这样我就可以用这些列创建一个新的数据帧,所以我尝试了这个

lapply(1:length(achem), function(i) which(achem[[i]], isTRUE))

但抛出错误

Error in arr.ind && !is.null(d <- dim(x)) : invalid 'x' type in 'x && y'

我试过

lapply(1:length(achem), function(i) which(as.logical(achem[[i]])))

但这并没有给我所需的[[i]]。任何简单的解决方案或使用Filter函数?

2 个答案:

答案 0 :(得分:1)

这似乎过于复杂。

如果achem真的是data.frame(请再现一个例子!),那么你可以这样做:

discardCols <- apply( achem, 2, function(x) any(x==-999.99) )
achem <- achem[ , !discardCols ]

答案 1 :(得分:1)

一种简单的方法是(假设所有列都是数字):

achem[!colSums(achem == -999.999)]

这将排除至少有一个值等于-999.999的所有列。