我编写了以下代码,根据列Time
从一个大型数据集中提取多个数据集。
for(i in 1:nrow(position)) {
assign(paste("position.",i,sep=""), subset(dataset, Time >= position[i,1] & Time <= position[i,2])
)
}
(position是包含starttime[,1]
和stoptime[,2]
)
输出是我原始数据集的子集,并且喜欢:
position.1
position.2
position.3
....
是否有可能为每个新数据集添加额外的列(position.1
,position.2
,...)哪个用数字定义?
例如:position.1
有一个值为1的额外列,position.2
有一个值为2的额外列,依此类推。
我需要这些数字来识别数据集(position.1
,position.2
,...),然后再次rbind
再次确定数据集。
答案 0 :(得分:1)
由于您未提供示例数据,因此未经测试,但应该适用于您:
dflist <-
lapply(1:nrow(position), function(x) {
within(dataset[dataset$Time >= position[x,1] & dataset$Time <= position[x,2],], val = x)
}
do.call(rbind, dflist)
基本上,您绝不想采用您建议的将多个编号对象分配给全局环境的策略。将所有子集存储在列表中然后使用do.call(rbind, dflist)
将它们重新绑定在一起要容易得多。这样更有效,在您的工作空间中产生更少的混乱,并且更具功能性#34;编程风格。
答案 1 :(得分:1)
除了Thomas建议避免副作用外,您可能还想利用检测重叠的现有包。 Bioconductor中的IRanges包可以检测一组范围(position
)与另一组范围或位置(dataset$Time
)之间的重叠。这可以获得时间点和范围之间的匹配:
r <- IRanges(position[[1L]], position[[2L]])
hits <- findOverlaps(dataset$Time, r)
现在,您想要提取与position
中每个范围重叠的数据集的子集。我们可以按主题(Time
)索引对查询(position
)索引进行分组,并使用该分组从dataset
中提取列表:
dataset <- DataFrame(dataset)
l <- extractList(dataset, split(queryHits(hits), subjectHits(hits)))
要获得最终答案,我们需要逐行组合列表元素,同时添加表示其组成员资格的列:
ans <- stack(l)