【问题标题】:Dplyr select_ and starts_with on multiple values in a variable list part 2Dplyr select_ 和 starts_with 在变量列表第 2 部分中的多个值
【发布时间】:2018-01-04 15:16:34
【问题描述】:

这是我之前问题的延续:Dplyr select_ and starts_with on multiple values in a variable list

我正在从不同位置的不同传感器收集数据,数据输出类似于:

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

问题(我认为)类似于:Using select_ and starts_with R 要么 select columns based on multiple strings with 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"

我希望选择将 FindSensor 与 FindLocation 结合起来,并为 Sensor1 和 Sensor2 选择温度和压力数据(不选择 Sensor1a)。返回带有数据和列标题的数据框:

日期、传感器 1 温度、传感器 1 压力、传感器 2 温度、传感器 2 压力

再次感谢!

【问题讨论】:

  • 试试df %&gt;% select(matches(paste(c("date", outer(FindLocation, FindSensor, paste, sep=".")), collapse="|")))
  • 是的,这行得通,谢谢!

标签: r select dplyr purrr multiple-matches


【解决方案1】:

类似的东西呢:

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

?

【讨论】:

    【解决方案2】:

    purrr 的一些函数将会很有用。首先,您使用cross2 计算FindLocationFindSensor 的笛卡尔积。你会得到一个配对列表。然后使用map_chrpaste 应用到它们,用一个点(.) 连接位置和传感器字符串。然后使用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))
    

    【讨论】:

    • 谢谢,之前没见过cross2——非常有用的功能!
    【解决方案3】:

    我们可以使用

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

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-19
      • 2016-04-08
      • 2021-12-27
      • 2016-04-01
      相关资源
      最近更新 更多