数据
我正在使用类似于 data.frame
的数据集生成如下:
set.seed(1)
dta <- data.frame(observation = 1:20,
valueA = runif(n = 20),
valueB = runif(n = 20),
valueC = runif(n = 20),
valueD = runif(n = 20))
dta[2:5,3] <- NA
dta[2:10,4] <- NA
dta[7:20,5] <- NA
列有
NA
最后一列有超过 60% 的观察值 NAs
.> sapply(dta, function(x) {table(is.na(x))})
$observation
FALSE
20
$valueA
FALSE
20
$valueB
FALSE TRUE
16 4
$valueC
FALSE TRUE
11 9
$valueD
FALSE TRUE
6 14
问题
我希望能够删除
dplyr
中的此列管道以某种方式将它传递给 select
论据。尝试
这可以在
base
中轻松完成.例如选择小于 50% 的列 NAs
我可以这样做:dta[, colSums(is.na(dta)) < nrow(dta) / 2]
它产生:
> head(dta[, colSums(is.na(dta)) < nrow(dta) / 2], 2)
observation valueA valueB valueC
1 1 0.2655087 0.9347052 0.8209463
2 2 0.3721239 NA NA
任务
我有兴趣在
dplyr
中实现相同的灵活性管线:Vectorize(require)(package = c("dplyr", # Data manipulation
"magrittr"), # Reverse pipe
char = TRUE)
dta %<>%
# Some transformations I'm doing on the data
mutate_each(funs(as.numeric)) %>%
# I want my select to take place here
最佳答案
大概是这个样子?
dta %>% select(which(colMeans(is.na(.)) < 0.5)) %>% head
# observation valueA valueB valueC
#1 1 0.2655087 0.9347052 0.8209463
#2 2 0.3721239 NA NA
#3 3 0.5728534 NA NA
#4 4 0.9082078 NA NA
#5 5 0.2016819 NA NA
#6 6 0.8983897 0.3861141 NA
更新 与
colMeans
而不是 colSums
这意味着您不再需要除以行数。而且,只是为了记录,在基础 R 中你也可以使用
colMeans
:dta[,colMeans(is.na(dta)) < 0.5]
关于r - 有条件地选择 dplyr 中特定比例的值为 NA 的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34852112/