【问题标题】:group by variable and find cases for which some variables are all missing按变量分组并查找某些变量全部丢失的情况
【发布时间】:2018-06-17 13:14:19
【问题描述】:

示例数据框:

library(dplyr)

n <- 5 
k <- 10
my_labels <- LETTERS[1:5]

foobar <- data.frame(group = gl(n, k, labels = my_labels), x = runif(n*k), y=rnorm(n*k), z = rpois(n*k, 1), month_name = (rep(month.name[1:k], n)))
index  <- sample(1:50,10)
foobar[index, c("x", "y", "z")] <- NA
foobar[foobar$group %in% c("B","E"), c("x", "y", "z")] <- NA

我想找到所有且只有那些级别的group,除month_name(当然还有group)之外的所有变量都完全丢失。在这种情况下,这些级别将是BE

解决方案应使用dplyr(如果可能)。如果需要选择列,不要select只选择列xyz,而是取消选择不想勾选的列,例如groupmonth_name。这是因为在实际用例中,我有几十个变量必须检查是否缺失,只有几个变量我不想检查:当然,在示例中,为了简单起见,我只使用了三个变量。

【问题讨论】:

    标签: r dplyr na


    【解决方案1】:

    我们可以在按'group'分组后使用filter_at对行进行子集化

    foobar %>%
       group_by(group) %>% 
       filter_at(vars(x, y, z) , all_vars(all(is.na(.))))
    

    返回“组”为“B”或“E”的行

    如果意图是获取其他'组的',则否定filter中的表达式

    foobar %>% 
      group_by(group) %>% 
      filter_at(vars(x, y, z) , all_vars(!all(is.na(.))))
    

    【讨论】:

    • 不错! all_varsdplyr 助手吗?但是,使用filter_at(vars(x, y, z),.. 有点烦人。正如我所解释的,在实际情况下,我需要检查 NA 的变量比我不需要检查的变量更多,而且它们的名称很奇怪。即,它会变成filter_at(vars(x1, x2, x3, x3, A1, zc, Alpha_X, y1, OmegaVar, z1, Z2, z3, zmaybe, zalways, zpheraps, daylight_saving, foo, bar, barfoo, barbar, barbarbaberbar,...。我不需要检查NA 的变量少得多 并且具有简单的名称。难道没有办法否定vars(..)吗?
    • @DeltaIV 如果你想取消选择,可以使用one_of你可以检查语法是?select
    • 回答已接受。关于为什么这需要使用all_vars() 的任何直觉?我看过帮助,但有点神秘。
    • @DeltaIV 谢谢,我不在。 all_vars 将查找与同一行中vars 中指定的所有变量匹配的条件,而any_vars 只需要一个变量满足过滤该行的条件。
    • @DeltaIV 我认为-one_of 应该像在select 中一样工作,但可能是filter_at 中的一个错误。你可以使用foobar %&gt;% group_by(group) %&gt;% filter_at(vars(setdiff(names(.), "month_name")), all_vars(!all(is.na(.))))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2012-11-18
    • 2013-07-28
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多