2017-04-20 58 views
0

我的數據是這樣的:使用dplyr過濾從一個變量的所有行,直到另一個

data <- data.frame(
    value = runif(10) 
    id = c("junk","start","1","2","end","morejunk","junk","start","4","end") 
) 

我想用filter()提取一切從id"start"直到id"end"。問題是起始行和結束行之間的觀察次數有所不同,所以我不能過濾每行x行。有沒有一種方法可以使用filter(),我可以指定from = "start"until = "end"

回答

1

您可以先確定「開始」和「結束」在哪裏。然後使用這些成對的索引來索引data.frame。這假設每次都有一對相應的開始和結束。

set.seed(0L) 
data <- data.frame(
    value = runif(10), 
    id = c("junk","start","1","2","end","morejunk","junk","start","4","end") 
) 
idx <- which(data$id %in% c("start", "end")) 
lapply(split(idx, ceiling(seq_along(idx)/2)), function(x) data[x[1]:x[2],]) 
1

可以

  • 使用which認同"start""end"行索引,
  • 從各加減1,分別以不包括那些行,
  • 通過這些通過Map,
  • unlist並行通過簡化爲simpli FY列表中的向量,並用
  • slice

  • 子集,這讓

    library(dplyr) 
    set.seed(47) 
    
    data <- data.frame(
        value = runif(10), 
        id = c("junk","start","1","2","end","morejunk","junk","start","4","end") 
    ) 
    
    data %>% slice(unlist(Map(`:`, 
              which(.$id == 'start') + 1, 
              which(.$id == 'end') - 1))) 
    #> # A tibble: 3 × 2 
    #>  value  id 
    #>  <dbl> <fctr> 
    #> 1 0.7615020  1 
    #> 2 0.8224916  2 
    #> 3 0.5433097  4 
    

    或基地,

    data[unlist(Map(`:`, 
           which(data$id == 'start') + 1, 
           which(data$id == 'end') - 1)), ] 
    #>  value id 
    #> 3 0.7615020 1 
    #> 4 0.8224916 2 
    #> 9 0.5433097 4 
    
  • +0

    喜歡你的基礎的解決方案 – chinsoon12

    +0

    謝謝!這非常有幫助。我不知道地圖。 – Another

    相關問題