[英]Subset columns using logical vector
我有一個數據框,我想刪除NA的速率> 70%的那些列,或者占主導地位值超過99%的行。 我怎么能在R?
我發現在子集函數中選擇具有邏輯向量的行更容易,但是如何對列進行相似的操作呢? 例如,如果我寫:
isNARateLt70 <- function(column) {//some code}
apply(dataframe, 2, isNARateLt70)
那我怎樣才能繼續使用這個向量來子集數據幀?
如果你有一個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]
當我們有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
參數在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.