【问题标题】:Remove columns based on a its cumsum [duplicate]根据其 cumsum 删除列 [重复]
【发布时间】:2021-01-10 06:26:07
【问题描述】:

起始数据集:

A   B   C   D   E   F   G
0   0   0   0   0   0   0
0   1   0   1   0   0   1
0   0   0   0   0   0   0
0   0   0   1   0   0   1
0   0   0   0   0   0   0
0   1   0   1   0   0   1
0   0   0   0   1   0   0

期望的输出:

B   D   E   G
0   0   0   0
1   1   0   1
0   0   0   0
0   1   0   1
0   0   0   0
1   1   0   1
0   0   1   0

所以我的想法是尝试按它们的 cumsum 对列进行分组,如果该总和 == 0,那么我可以删除它们,但由于某种原因,我无法让它工作。我有成千上万这样的列要删除。我了解如何一次完成一项,我似乎无法将内容扩展到我需要删除的所有列。我的 excel 大脑仍然阻碍着我。到目前为止,在我正在编写的脚本中,我一直倾向于使用 dplyr,但我还没有能够破解这个。

感谢您的帮助!

【问题讨论】:

    标签: r


    【解决方案1】:

    如果数据中只有 1/0,则可以使用:

    library(dplyr)
    df %>% select(where(~sum(.) != 0))
    #select_if in older version of dplyr
    #df %>% select_if(~sum(.) != 0)
    
    #  B D E G
    #1 0 0 0 0
    #2 1 1 0 1
    #3 0 0 0 0
    #4 0 1 0 1
    #5 0 0 0 0
    #6 1 1 0 1
    #7 0 0 1 0
    

    如果您的数据中也有负数,您可以检查any 值是否不等于 0 并选择该列。

    df %>% select(where(~any(. != 0)))
    #df %>% select_if(~any(. != 0))
    

    数据

    df <- structure(list(A = c(0L, 0L, 0L, 0L, 0L, 0L, 0L), B = c(0L, 1L, 
    0L, 0L, 0L, 1L, 0L), C = c(0L, 0L, 0L, 0L, 0L, 0L, 0L), D = c(0L, 
    1L, 0L, 1L, 0L, 1L, 0L), E = c(0L, 0L, 0L, 0L, 0L, 0L, 1L), F = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L), G = c(0L, 1L, 0L, 1L, 0L, 1L, 0L)), 
    class = "data.frame", row.names = c(NA, -7L))
    

    【讨论】:

    • 干杯,我有两个澄清,我想问一下。首先,当我在我的数据集上运行该代码时,它确实包含所有数值(没有字符或任何其他因素)我收到错误:workingFile &lt;- workingFile %&gt;% select(where(~sum(.) != 0)) Error: where() must be used with functions that return TRUE or FALSE.`
    • @PlotDevice 你能用我帖子里的数据测试一下吗?代码对它有用吗?在dplyr 1.0.0 中还引入了where,因此您需要拥有最新的dplyr 或使用select_ifdf %&gt;% select_if(~sum(.) != 0)
    • 第二个是如果我有非数字列,我如何忽略这些,选择范围,然后删除范围中的选定列而不删除我忽略的列?
    • 啊纳米,重新出错。我以为我有最新版本的 dplyr,但 select_if 就像一个魅力。我正在戳的第二个澄清,但还没有弄清楚
    • 如果你想选择有数字列的范围内的列而不删除非数字列,你可以试试df %&gt;% select_if(~is.numeric(.) &amp;&amp; sum(.) != 0 || !is.numeric(.))
    【解决方案2】:

    对于数据框mydf,假设值都是0或1:

    new_df <- mydf[colSums(mydf) > 0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 2021-02-09
      • 1970-01-01
      • 2017-02-12
      • 2019-05-29
      • 2017-03-02
      • 1970-01-01
      • 2017-07-06
      相关资源
      最近更新 更多