簡體   English   中英

使用邏輯向量的子集列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM