删除多于x个负值的列

时间:2019-06-10 00:39:39

标签: r filter subset

我有一个带有多个负值的矩阵。我想删除包含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)

非常感谢

2 个答案:

答案 0 :(得分:3)

使用colSums

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

答案 1 :(得分:1)

这里有几种方法

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]