使用循环将列添加到数据集

时间:2014-07-28 08:10:41

标签: r

我编写了以下代码,根据列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.1position.2,...)哪个用数字定义?

例如:position.1有一个值为1的额外列,position.2有一个值为2的额外列,依此类推。

我需要这些数字来识别数据集(position.1position.2,...),然后再次rbind再次确定数据集。

2 个答案:

答案 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)