[英]Using dplyr to select a range based on a grouping variable in a separate data.frame
我想根據分組因子和單獨的data.frame
的時間片范圍對包含不規則采樣時間序列的data.frame
進行切片。 我現在正在以一種非常不優雅的方式使用循環來執行此操作。 我一直試圖通過整潔的語法變得更好,並想知道是否有更優雅的方法來從foo
和bar
獲取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.