Фильтрация строк в R, когда условие удовлетворяет менее половины ячеек строки - PullRequest
0 голосов
/ 05 июня 2019

У меня есть матрица с 276 выборками столбцов и 215000 строк.Значения варьируются от нуля до некоторого неотрицательного значения.

Я буду использовать mtcars в качестве упрощенного примера.

Мне нужно отфильтровать строки, в которых менее 50% (может быть любой процент) выборок не достигает определенного значения, например 1.

Пример матрицы:

Tmtcars <- t(mtcars[1:5,c(2, 8:11)])

Мне нужно выбрать строки, где не менее 50% ячеек равно или больше 1.

Только строка «vs = c»(0,0,1,1,0) »не соответствует этому условию.Поскольку только 2 ячейки (40%) равны 1 или больше.

Строка «am = c (1,1,1,0,0)» должна быть выбрана, поскольку 3 ячейки (60%) равны илибольше 1.

Если я запускаю функцию rowMeans

Filtered <- Tmtcars[(rowMeans(Tmtcars) >= 1 ) >=0.5, ]

, строка «am» не выбрана.

Критерием выбора должно быть 50%Ячейки соответствуют критериям, не имеют ничего общего со средним.

Спасибо!

Ответы [ 4 ]

0 голосов
/ 06 июня 2019

Спасибо, я адаптировал некоторые ответы, и у меня было 3 способа, которые дают мне одинаковые результаты

F1 <- Tmtcars[rowSums(Tmtcars >= 1) >= (ncol(Tmtcars)/2), ]

F1b <- Tmtcars[rowMeans(Tmtcars >= 1) >= 0.5, ]

F2 <- Tmtcars[apply(Tmtcars, 1, function(x) mean(x>=1)>=0.5),]
0 голосов
/ 05 июня 2019

Параметры True / False имеют числовые значения в R.

TRUE + TRUE ; FALSE + FALSE ; FALSE + TRUE

Вы можете использовать эту функцию и сумму, чтобы выбрать количество строк

sum( 5 == c( 3, 5, 5, 2))

Вы можете поднастроить строки, как это. Когда условие выполняется более 5 раз, мы подмножество основано на условии

if( sum( mtcars$mpg >20 ) > 5 ) mtcars[  mtcars$mpg >20 , ]

Вы также можете создавать логические векторы для подмножества или создания новой переменной

# more than five times - mpg greater than 20
    rows <- rep(sum( mtcars$mpg >20 ) > 5, nrow( mtcars))  & mtcars$mpg >20 

# more than 25 times
    rowshigher <- rep(sum( mtcars$mpg >20 ) > 25, nrow( mtcars))  & mtcars$mpg >20 

mtcars[ rows , ]
0 голосов
/ 05 июня 2019

В вашем случае вы можете сделать с

DF3[rowMeans(DF3[,1:20]) > 2 )>0.5, ]
0 голосов
/ 05 июня 2019

Вы можете использовать rowSums():

set.seed(1)
sample1 <- c(sample(1:10, 5))
sample2 <- c(sample(1:10, 5))
sample3 <- c(sample(1:10, 5))
sample4 <- c(sample(1:10, 5))
sample5 <- c(sample(1:10, 5))

df <- data.frame(sample1, sample2, sample3, sample4, sample5)

df2 <- df[rowSums(df > 2) > (ncol(df)/2),]

Очевидно, вы можете играть со значениями. Первое 2 - это значение для сравнения, второе 2 ищет строки, в которых сопоставление превышает 50%.

...