【发布时间】:2016-04-23 11:16:19
【问题描述】:
数据
我正在使用类似于下面生成的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
【问题讨论】:
-
您可以使用
Filter,即Filter(function(x) sum(is.na(x)) < length(x)/2, dta) -
@akrun 一如既往,感谢您的帮助。我只是想知道,
filter不应该放弃观察吗?我有兴趣删除列而不是行。 -
它正在删除列,即
Filter,大写为F -
@akrun 现在,我找到你了
?Filter != ?filter:) -
我用
summarise_each添加了一个解决方案。也许对你有帮助。
标签: r filter dataframe dplyr na