Dplyr select_ и запускается с несколькими значениями в списке переменных, часть 2

Это продолжение моего вопроса ранее: Dplyr select_ и sets_with для нескольких значений в списке переменных

Я собираю данные с разных датчиков в разных местах, вывод данных что-то вроде:

df<-data.frame(date=c(2011,2012,2013,2014,2015),"Sensor1 Temp"=c(15,18,15,14,19),"Sensor1 Pressure"=c(1001, 1000, 1002, 1004, 1000),"Sensor1a Temp"=c(15,18,15,14,19),"Sensor1a Pressure"=c(1001, 1000, 1002, 1004, 1000), "Sensor2 Temp"=c(15,18,15,14,19),"Sensor2 Pressure"=c(1001, 1000, 1002, 1004, 1000), "Sensor2 DewPoint"=c(10,11,10,9,12),"Sensor2 Humidity"=c(90, 100, 90, 100, 80))

Проблема (я думаю) похожа на следующее: использование select_ и start_with R или выбор столбцов на основе нескольких строк с помощью dplyr

Я хочу искать датчики, например, по местоположению, поэтому у меня есть список для поиска по фрейму данных, а также указана временная метка. Но поиск падает, когда я ищу более одного датчика (или типа датчика и т. Д.). Есть ли способ использовать dplyr (NSE или SE) для достижения этой цели?

FindLocation = c("date", "Sensor1", "Sensor2")
df %>% select(matches(paste(FindLocation, collapse="|"))) # works but picks up "Sensor1a" and "DewPoint" and "Humidity" data from Sensor2 

Также я хочу добавить смешанные поиски, такие как:

 FindLocation = c("Sensor1", "Sensor2") # without selecting "Sensor1a"
 FindSensor = c("Temp", "Pressure") # without selecting "DewPoint" or "Humidity"

Я надеюсь, что select объединяет FindSensor с FindLocation и выбирает данные о температуре и давлении для Sensor1 и Sensor2 (без выбора Sensor1a). Возвращение информационного кадра с данными и заголовками столбцов:

дата, Датчик1 Температура, Датчик1 Давление, Датчик2 Температура, Датчик2 Давление

Большое спасибо еще раз!

3 ответа

Решение

Некоторые функции из purrr собираются быть полезными. Во-первых, вы используете cross2 вычислить декартово произведение FindLocation а также FindSensor, Вы получите список пар. Тогда вы используете map_chr применять paste к ним, соединяя местоположение и сенсорную строку с точкой (.). Затем вы используете one_of помощник для выбора столбцов.

library(purrr)

FindLocation = c("Sensor1", "Sensor2")
FindSensor = c("Temp", "Pressure")

columns = cross2(FindLocation, FindSensor) %>%
  map_chr(paste, collapse = ".")

df %>% select(one_of(columns))

Как насчет чего-то вроде:

library(tidyverse)
wich_col <- df %>% names %>% strsplit("[.]") %>% map_lgl(function(x)x[1]%in%FindLocation&x[2]%in%FindSensor)
df[wich_col]

?

Мы можем использовать

df %>% 
  select(matches(paste(c("date", outer(FindLocation, 
                FindSensor, paste, sep=".")), collapse="|")))
Другие вопросы по тегам