使用逻辑向量的子集列

时间:2014-06-12 18:45:44

标签: r dataframe

我有一个数据框,我想删除这些列的NA' s> 70%或占主导地位的行占99%。我怎么能在R?中做到这一点?

我发现在子集函数中选择具有逻辑向量的行更容易,但是如何对列进行类似的操作呢?例如,如果我写:

isNARateLt70 <- function(column) {//some code}
apply(dataframe, 2, isNARateLt70)

那么如何继续使用此向量来分组数据帧?

3 个答案:

答案 0 :(得分:3)

如果您有像

这样的data.frame
dd <- data.frame(matrix(rpois(7*4,10),ncol=7, dimnames=list(NULL,letters[1:7])))

#    a b  c  d  e  f  g
# 1 11 2  5  9  7  6 10
# 2 10 5 11 13 11 11  8
# 3 14 8  6 16  9 11  9
# 4 11 8 12  8 11  6 10

您可以使用

之一对逻辑向量进行子集化
mycols<-c(T,F,F,T,F,F,T)
dd[mycols]
dd[, mycols]

答案 1 :(得分:0)

当我们有colMeans时,确实没有必要编写函数(感谢@MrFlick从colSums()/nrow()更改建议,并在本答案的底部显示)。

如果您想稍后使用sapply,我将如何处理您的功能。

> d <- data.frame(x = rep(NA, 5), y = c(1, NA, NA, 1, 1),
                  z = c(rep(NA, 3), 1, 2))

> isNARateLt70 <- function(x) mean(is.na(x)) <= 0.7
> sapply(d, isNARateLt70)
#     x     y     z 
# FALSE  TRUE  TRUE 

然后,使用上面的代码行将您的数据与上述行进行子集化,它是

> d[sapply(d, isNARateLt70)]

但如上所述,colMeans的工作原理相同,

> d[colMeans(is.na(d)) <= 0.7]
#    y  z
# 1  1 NA
# 2 NA NA
# 3 NA NA
# 4  1  1
# 5  1  2

答案 2 :(得分:0)

也许这也会有所帮助。 2中的apply()参数表示在data.frame cars上逐列应用此函数。

> columns <- apply(cars, 2, function(x) {mean(x) > 10})
> columns
speed  dist
 TRUE  TRUE
> cars[1:10, columns]
   speed dist
1      4    2
2      4   10
3      7    4
4      7   22
5      8   16
6      9   10
7     10   18
8     10   26
9     10   34
10    11   17