我正在处理类似于下面生成的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
列中包含NAs
个值,最后一列的观察结果超过60%> 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
参数中。
这可以在NAs
中轻松完成。例如,要选择小于 50% 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
管道中实现相同的灵活性:
nextLine
答案 0 :(得分:14)
或许这样吗?
colMeans
使用colSums
而不是colMeans
更新了,这意味着您不再需要除以行数。
而且,仅为了记录,在基础R中你也可以使用dta[,colMeans(is.na(dta)) < 0.5]
:
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("test");
delay(1000);
}
答案 1 :(得分:5)
现在 dplyr
已达到 1.0.0,其中包含 where()
:
dta %>% select(where(function(x) sum(is.na(x)) / length(x) < 0.5))
答案 2 :(得分:3)
获得extract
magrittr
中的summarise_each/unlist
library(magrittr)
library(dplyr)
dta %>%
summarise_each(funs(sum(is.na(.)) < n()/2)) %>%
unlist() %>%
extract(dta,.)
或使用Filter
base R
Filter(function(x) sum(is.na(x)) < length(x)/2, dta)
或稍微紧凑的选项是
Filter(function(x) mean(is.na(x)) < 0.5, dta)
答案 3 :(得分:2)
我认为这可以胜任:
dta %>% select_if(~mean(is.na(.)) < 0.5) %>% head()
observation valueA valueB valueC
1 0.2655087 0.9347052 0.8209463
2 0.3721239 NA NA
3 0.5728534 NA NA
4 0.9082078 NA NA
5 0.2016819 NA NA
6 0.8983897 0.3861141 NA
`