2014-10-07 678 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