Напишите функцию, которая выполняет тестирование в одном столбце и возвращает TRUE
или FALSE
, затем используйте Filter
, чтобы применить ее к каждому столбцу в фрейме данных, и сохраните только TRUE
s:
foo = function(x) {
if (length(x) %% 2 == 1) {
stop("Odd number of rows!")
}
odd = seq(1, length(x), by = 2)
even = odd + 1
ratio = x[odd] / x[even]
return(any(ratio >= 2 | ratio <= 0.5))
}
Filter(foo, my_df)
# a
# 1 0.000
# 2 0.000
# 3 4.020
# 4 2.004
# 5 1.001
# 6 0.004
Я оставлю на ваше усмотрение модификацию функции, которая может вам понадобиться (например, если введенное число строк нечетное).
Использование этих данных:
my_df <- read.table(text =' a b c
1 0.000 0.001 0.883
2 0.000 0.001 1.471
3 4.020 0.003 1.357
4 2.004 0.004 1.618
5 1.001 0.005 1.110
6 0.004 0.006 1.048', header = TRUE)