如何将数据帧拆分/子集化为R中的多个数据帧

时间:2014-10-07 20:33:35

标签: r dataframe extract subset

我查看了网络和堆栈流,但我无法找到问题的解决方案。我不知道哪个dplyr或循环会更有效。

在数据帧的示例(我自己的数据集有超过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))

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

从Bioconductor获取IRanges:

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)

这种情况发生时没有实际形成单独的列表元素(列表是懒惰管理的),因此应该很快。