【问题标题】:Remove columns with more than x negative values删除具有超过 x 个负值的列
【发布时间】:2019-06-10 00:39:39
【问题描述】:

我有一个包含多个负值的矩阵。我想删除包含超过 3 或 4 个负值的列,以便剩余的列只有 1 或 2 个负值。

我找不到我的问题的答案。我知道如何删除包含至少 1 个负值的所有列,但不是我想要做出的选择(删除具有 3 个以上负值的列)

数据框是:

M = ( 1  0  0  1 -9  0  7  1)
    ( 1 -1  0  2  1  0  0  1)
    ( 1 -1 -5 -3 -7 -3 -5 -3)
    ( 4 -3  4 -2  3  4 -8  3)
    (-2  3  4 -3 -1 -4 -6 -2)

我需要它(如果 3 个或更多负值):

M = ( 1  0  0  1)
    ( 1  0  0  1)
    ( 1 -5 -3 -3)
    ( 4  4  4  3)
    (-2  4 -4 -2)

非常感谢

【问题讨论】:

  • 有很多方法可以实现,一个例子是M[,!apply(M, 2, function(x) sum( x < 0 ) >= 3)]

标签: r filter subset


【解决方案1】:

使用colSums

x=2
df = df[,colSums(df<0)<=x]

【讨论】:

    【解决方案2】:

    这里有几种方法可以做到这一点

    n <- 3
    library(dplyr)
    df %>% select_if(~sum(. < 0) < n)
    
    #  V1 V3 V6 V8
    #1  1  0  0  1
    #2  1  0  0  1
    #3  1 -5 -3 -3
    #4  4  4  4  3
    #5 -2  4 -4 -2
    

    我们可以在apply/sapply中应用相同的逻辑

    df[apply(df < 0 , 2, sum) < n]
    df[sapply(df, function(x) sum(x < 0)) < n]
    

    另一种选择是计算 sign 的数字以过滤列

    df %>% select_if(~sum(sign(.) == -1) < n)
    
    df[apply(sign(df) == -1, 2, sum) < n]
    
    df[sapply(sign(df), function(x) sum(x == -1)) < n]
    

    【讨论】:

      猜你喜欢
      • 2019-08-13
      • 1970-01-01
      • 2019-05-06
      • 2015-10-29
      • 2015-06-07
      • 2019-03-13
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多