2014-10-07 684 views
0

我已經瀏覽了web和stackflow,但無法找到解決方案。我不知道哪個dplyr或循環會更有效率。如何在R中將數據幀拆分/分組爲多個數據框

下面是一個數據框的示例(我自己的數據集有超過10,000行)我想根據列B(< 250)將它們分成三個對象或三個單獨的數據框。然後,對於每個新的數據幀,我希望計算點的數量(或數據幀的長度)和持續時間(列時間以秒爲單位)。任何建議將非常感激。

謝謝

馬丁

dput(mydata) 
structure(list(Time = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 0L, 
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L), A = c(4L, 5L, 6L, 7L, 
3L, 7L, 8L, 10L, 11L, 8L, 10L, 12L, 14L, 6L, 14L, 16L, 20L, 22L 
), B = c(100.25, 150.75, 200, 1000.56, 2000.1, 100, 150, 50, 
25.2, 102.25, 152.75, 202, 1002.56, 2002.1, 102, 152, 52, 27.2 
)), .Names = c("Time", "A", "B"), class = "data.frame", row.names = c(NA, 
-18L)) 
+0

請澄清如何從'mydata $ B <250'獲得「第2行到第4行;第7行到第13行;第16到第19行」 – jdharrison 2014-10-07 21:53:43

+0

從上面的例子中,我只想在列B <250時提取三個塊作爲列表(具有3個對象)或作爲單獨的數據框(3)。 – MLavoie 2014-10-07 22:07:38

+0

@MLavoie:請編輯你的問題,以包括所有相關的事實。讓人們提出問題來理解不完整的規格說明只會招致潛在的貢獻者。 – 2014-10-07 22:19:24

回答

0

抓鬥IRanges從Bioconductor的:

runs <- slice(Rle(df$B), upper=250) 

這是一個RleViews對象,其視圖(範圍)爲250以下的每個運行。您可以提取視圖的寬度(每個數據框中的點數):

width(runs) 

您可以將數據幀分成像這樣的列表:

blocks <- extractList(df, ranges(runs)) 

注意blocks現在是一個正式的SplitDataFrameList。

要計算的持續時間,就可以提取Time列作爲IntegerList並計算每個列表元素的最後一個和第一元件之間的區別:

time <- blocks[,"Time"] 
ptail(time, 1) - phead(time, 1) 

會發生這種情況,而無需實際形成單獨的列表的元素(在列表懶惰地管理),所以應該很快。

0

目前尚不清楚您的要求怎麼行了你的預期輸出。這裏有分裂的兩種不同的方法:

# Gives three groups 
split(mydata[mydata$B <250, ] , (1:nrow(mydata[mydata$B <250, ]))%% 3) 
# Gives groups of size three 
split(mydata[mydata$B <250, ] , (1:nrow(mydata[mydata$B <250, ]))%/% 3) 

這表明如何從第一種方法計算行數:

> three <- split(mydata[mydata$B <250, ] , (1:nrow(mydata[mydata$B <250, ]))%% 3) 

> lapply(three, nrow) 
$`0` 
[1] 4 

$`1` 
[1] 5 

$`2` 
[1] 5