【问题标题】:delete columns in R for certain variables only仅删除 R 中某些变量的列
【发布时间】:2018-03-07 22:15:50
【问题描述】:

我有一个数据框 x,其列名具有相似的前缀(age_1、age_2、age_3、...、age_n)。我想删除前缀为“age_”的列,这些列都是 NA。在下面的示例中,它将是 age_2 和 age_4。但在我的数据集中,它可能会上升到 age_100。有没有办法做到这一点?

示例数据框:

x <- data.frame("age_1" = c(0,1,1,0), "age_2" = NA , "age_3" = c(1,0,0,0), "age_4"=NA, "name_1" = NA, "name_2" = NA)

示例输出:

y <- data.frame("age_1" = c(0,1,1,0), "age_3" = c(1,0,0,0), "name_1" = NA, "name_2" = NA)

【问题讨论】:

    标签: r


    【解决方案1】:

    您想通过两个条件进行选择:列名以age_ 开头,并且其所有元素都是NA。您可以通过以下方式选择这些列:

    sel = grepl("^age_",colnames(x), ignore.case = T) & sapply(x, FUN = function(x){all(is.na(x))})
    

    然后做:

    new_x = x[,!sel]
    

    结果

      age_1 age_3 name_1 name_2
    1     0     1     NA     NA
    2     1     0     NA     NA
    3     1     0     NA     NA
    4     0     0     NA     NA
    

    grepl(...) 仅适用于以 age_ 开头的那些列

    sapply(...) 将遍历每一列,并在 all 元素为 NA (is.na()) 时返回 true。

    两者的交集是您需要忽略的(sel 否定 !)。

    【讨论】:

    • 做到了!工作。谢谢!
    【解决方案2】:
    y_1 <- x %>% select(which(!(names(.) %in% grep("^[age]", names(.), value = T))))
    y_2 <- x[colSums(!is.na(x)) > 0]
    y <- bind_cols(y_1,y_2)
    

    不优雅但有效

    【讨论】:

      【解决方案3】:

      另一种选择是使用colSumsgrepl

      x[, as.vector(!is.na(colSums(x))) | grepl(pattern = "name", names(x))]
      #  age_1 age_3 name_1 name_2
      #1     0     1     NA     NA
      #2     1     0     NA     NA
      #3     1     0     NA     NA
      #4     0     0     NA     NA
      

      【讨论】:

      • 是的,这个也很好用。但是,如果那里有更多具有相似前缀的变量名,例如gender_1、gender_2、...、gender_n,您能解释一下模式将如何工作吗?
      • @imprela 模式将变为grepl(pattern = "name|gender", names(x)),即namegender
      猜你喜欢
      • 2020-04-07
      • 2018-08-08
      • 1970-01-01
      • 2012-10-12
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      相关资源
      最近更新 更多