【问题标题】:How to remove columns with same value in R如何在R中删除具有相同值的列
【发布时间】:2015-05-30 09:07:05
【问题描述】:

简而言之:

我想用我的桌子做这个,

说明:

我有一张大桌子,里面有 20,000 x 1,200 件物品。我想删除所有从上到下具有相同值的列。但它不应该更改变量名称(示例中为 V2),以便稍后我可以确定删除了哪个变量。

【问题讨论】:

    标签: r


    【解决方案1】:

    只需使用vapply 来检查每列中有多少个唯一值:

    样本数据:

    mydf <- data.frame(v1 = 1:4, v2 = 5:8,
                       v3 = 2, v4 = 9:12, v5 = 1)
    mydf
    ##   v1 v2 v3 v4 v5
    ## 1  1  5  2  9  1
    ## 2  2  6  2 10  1
    ## 3  3  7  2 11  1
    ## 4  4  8  2 12  1
    

    我们将如何处理vapply

    vapply(mydf, function(x) length(unique(x)) > 1, logical(1L))
    #    v1    v2    v3    v4    v5 
    #  TRUE  TRUE FALSE  TRUE FALSE 
    

    保留你想要的列:

    mydf[vapply(mydf, function(x) length(unique(x)) > 1, logical(1L))]
    #   v1 v2 v4
    # 1  1  5  9
    # 2  2  6 10
    # 3  3  7 11
    # 4  4  8 12
    

    【讨论】:

    • @Dev,当您使用vapply(而不是sapply)时,您必须指定输出预期所在的“模板”。在这种情况下,我们期望@ 987654328@ 返回单个 TRUEFALSE。因此,我们的模板需要一个长度为 1 的逻辑值,我们用logical(1L) 表示(L 在这里表示一个整数值)。
    • @AnandaMahto 今天刚看到这篇文章。我学到了更多关于我不经常使用的“vapply”。顺便说一下,我想说谢谢你对 git 的回复。我正在使用 Mac 并在很长一段时间内面临 spread 问题。希望以后能解决这个问题。
    • +1 此方法适用于因子和数值变量!在检查多个级别或方差 = 0 之前,我不再需要担心从数字列中分离出因子。
    【解决方案2】:

    如果有人尝试使用 dplyr 执行此操作,这是另一种方法:

    library(dplyr)
    mydf %>% select(where(~n_distinct(.) > 1))
    

    【讨论】:

      【解决方案3】:

      这里有一个简短的方法:

      >Filter(var, mydf)
        v1 v2 v4
      1  1  5  9
      2  2  6 10
      3  3  7 11
      4  4  8 12
      

      这是可行的,因为零方差被解释为错误。

      注意: 不适用于字符类列。

      【讨论】:

      • 此方法仅适用于数字列。一般来说,可能是Filter(function(x) length(unique(x))&gt;1, mydf)
      • @akruIt 也适用于因子,例如var(PlantGrowth$group)。它可能适用于除字符之外的所有内容。
      • @NealFuitz 是的,但 length(unique 将适用于大多数情况。
      【解决方案4】:

      使用colSums

      df[colSums(df[1,][col(df)]!=df)!=0]
      #  V1 V3 V4
      #1  1  3  1
      #2  4  4  2
      #3  2  3  3
      #4  5  3  3
      

      数据

      df <- structure(list(V1 = c(1, 4, 2, 5), V2 = c(2, 2, 2, 2), V3 = c(3, 
      4, 3, 3), V4 = c(1, 2, 3, 3)), .Names = c("V1", "V2", "V3", "V4"
      ), row.names = c(NA, -4L), class = "data.frame")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-12
        • 1970-01-01
        • 2022-01-21
        • 2022-12-16
        • 2018-08-09
        相关资源
        最近更新 更多