我查看了网络和堆栈流,但我无法找到问题的解决方案。我不知道哪个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))
答案 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)
这种情况发生时没有实际形成单独的列表元素(列表是懒惰管理的),因此应该很快。