Удалить столбцы с более чем x отрицательными значениями - PullRequest
1 голос
/ 10 июня 2019

У меня есть матрица с несколькими отрицательными значениями.Я хочу удалить столбцы, содержащие более 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)

Iдолжно быть (если 3 или более отрицательных значения):

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

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 10 июня 2019

Использование colSums

x=2
df = df[,colSums(df<0)<=x]
1 голос
/ 10 июня 2019

Вот несколько способов сделать это

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...