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="|")))