我有一个数据框,我想删除这些列的NA' s> 70%或占主导地位的行占99%。我怎么能在R?中做到这一点?
我发现在子集函数中选择具有逻辑向量的行更容易,但是如何对列进行类似的操作呢?例如,如果我写:
isNARateLt70 <- function(column) {//some code}
apply(dataframe, 2, isNARateLt70)
那么如何继续使用此向量来分组数据帧?
答案 0 :(得分:3)
如果您有像
这样的data.framedd <- 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