簡體   English   中英

使用 dplyr 根據單獨的 data.frame 中的分組變量選擇范圍

[英]Using dplyr to select a range based on a grouping variable in a separate data.frame

我想根據分組因子和單獨的data.frame的時間片范圍對包含不規則采樣時間序列的data.frame進行切片。 我現在正在以一種非常不優雅的方式使用循環來執行此操作。 我一直試圖通過整潔的語法變得更好,並想知道是否有更優雅的方法來從foobar獲取res

foo <- data.frame(x=seq(1,100,by=2),y=rnorm(n=50)) 
# foo$x would actually be less regular in the real data
bar <- data.frame(ID=c("Stage_1","Stage_2","Stage_3","Stage_4"),
                  xMin = c(10,32,54,85),
                  xMax = c(17,50,76,89))
res <- data.frame()
for(i in 1:nlevels(bar$ID)){
  xMin <- bar$xMin[bar$ID==levels(bar$ID)[i]]
  xMax <- bar$xMax[bar$ID==levels(bar$ID)[i]]

  xMinIndex <- findInterval(xMin,foo$x) #could fuss inner and outer search
  xMaxIndex <- findInterval(xMax,foo$x)

  tmp <- foo[xMinIndex:xMaxIndex,]
  tmp$ID <- levels(bar$ID)[i]
  res <- rbind(res,tmp)
}
res

任何提示表示贊賞。

這是Map一個選項

res1 <- do.call(rbind, Map(function(x, y, z) 
   data.frame(foo[x:y,], ID = as.character(z), stringsAsFactors = FALSE),
     findInterval(bar$xMin, foo$x),
        findInterval(bar$xMax, foo$x), bar$ID))
all.equal(res1, res)
#[1] TRUE

或者使用data.table

library(data.table)
setDT(foo)[bar,  on = .(x >= xMin, x <= xMax)]

或者使用tidyverse

library(dplyr)
library(purrr)
library(tidyr)
bar %>% 
    transmute(ID, col1 = map2(findInterval(xMin, foo$x),  
                               findInterval(xMax, foo$x),  ~
                         foo %>% slice(.x:.y))) %>% 
    unnest(c(col1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM