2017-07-28 4 views
0

Dies ist eine Fortsetzung meiner Frage früher ist: Dplyr select_ and starts_with on multiple values in a variable listDplyr SELECT_ und starts_with auf mehrere Werte in einer Variablenliste Teil 2

ich Daten von differnt Sensoren an verschiedenen Orten sammle, Datenausgabe ist so etwas wie:

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

Das Problem ist (glaube ich) ähnlich: Using select_ and starts_with R oder select columns based on multiple strings with dplyr

ich möchte für Sensoren zB durch lo suchen Ich habe also eine Liste, um den Datenrahmen zu durchsuchen und auch den Zeitstempel einzubeziehen. Aber die Suche fällt auseinander, wenn ich nach mehr als einem Sensor (oder Typ von Sensor usw.) suche. Gibt es eine Möglichkeit, dplyr (NSE oder SE) zu verwenden, um dies zu erreichen?

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

Auch ich will gemischte Suche hinzufügen wie:

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

ich die select kombiniert hoffe FindSensor mit findlocation und wählt Temp und Druckdaten für Sensor1 und Sensor2 (ohne Sensor1a Auswahl). Zurückführen der Datenrahmen mit den Daten und den Spaltenüberschriften:

Datum, Sensor1 Temp, Sensor1 Druck, Sensor2 Temp, Sensor2 Druck

wieder Vielen Dank!

+0

Try können 'df%>% (matches (Paste (c wählen ("date", äußere (findlocation, FindSensor, Paste, sep = "")), collapse = "|"))) ' – akrun

+0

Ja, das funktioniert, danke! –

Antwort

2

Einige Funktionen von purrr werden nützlich sein. Zuerst verwenden Sie , um das kartesische Produkt FindLocation und FindSensor zu berechnen. Sie erhalten eine Liste von Paaren. Dann verwenden Sie map_chr, um paste auf sie anzuwenden, die Position und Sensorstränge mit einem Punkt (.) verbinden. Dann verwenden Sie den one_of Helfer, um die Spalten auszuwählen.

library(purrr) 

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

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

df %>% select(one_of(columns)) 
+0

Danke und habe cross2 vorher noch nicht gesehen - sehr nützliche Funktion! –

1

Was ist so etwas wie:

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

?

+0

Funktioniert und danke! –

2

Wir

df %>% 
    select(matches(paste(c("date", outer(FindLocation, 
       FindSensor, paste, sep=".")), collapse="|"))) 
+1

Funktioniert! Danke und wählt auch das Datum aus –

Verwandte Themen