Возврат списка столбцов, содержащих данные за пределами заданного диапазона в r - PullRequest
2 голосов
/ 09 ноября 2019

Чтобы отфильтровать data.frame только для интересующих столбцов, мне нужно найти столбцы в этом data.frame, содержащие данные за пределами определенного диапазона. Пусть data.frame будет

df<-data.frame(x1=c(1,5,9),x2=c(10,20,30),x3=c(20,100,1000))
ranges<-data.frame(y1=c(3,8),y2=c(10,20), y3=c(15,1250))

В качестве вывода я хотел бы получить список, возвращающий имена столбцов: "x1", "x2"

Я попробовал следующее, но код работаеттолько если «range» содержит все числа, указанные ниже, и соответствует, если число найдено. Это, к сожалению, не то, что мне нужно.

ranges<-c(15:300,10:20)
df.l<-colnames(df)[sapply(df,function(x) any(x %in% ranges))]

Есть идеи? Спасибо!

1 Ответ

2 голосов
/ 09 ноября 2019

Если 'range' - это data.frame или список, один из вариантов:

names(which(unlist(Map(function(x, y) any(!(x >= y[1] & x <= y[2])), df, ranges))))
#[1] "x1" "x2"

Или используйте обратную логику

names(which(unlist(Map(function(x, y) any(x < y[1]| x > y[2]), df, ranges))))

Или в режиме tidyverse,

library(purrr)
library(dplyr)
library(tibble)
map2(df, ranges, ~ between(.x, .y[1], .y[2]) %>% `!` %>% any) %>% 
    enframe %>% 
    unnest(cols = value) %>% 
    filter(value) %>% 
    pull(name)
#[1] "x1" "x2"

данные

ranges <- data.frame(y1 = c(3, 8), y2 = c(10, 20), y3 = c(15, 1250))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...