我有一个带有多个负值的矩阵。我想删除包含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)
非常感谢
答案 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]