【发布时间】:2014-08-25 05:00:58
【问题描述】:
我正在尝试修改另一个列表中包含的基于列表的信息。问题的本质是一个列表list1包含数据框——每列两列,第1列(time)=时间瞬间,第2列(score)填充0s——另一个列表@ 987654324@ 包含数据框——两列包含成对的时间实例(例如 0.12 和 0.125 或 1.54 和 1.57),或时间窗口的起点和终点。 list1中的每个数据框在list2中都有一个对应的(即同名)数据框
目标是通过修改确定list1 中每个数据帧中的哪些时间瞬间(即来自time 列)确实落在list2 中相关数据帧中包含的任何时间窗口之间list1(全零)中数据帧的“分数”列,如果其关联的时间时刻在来自list2 的相应(即同名)数据帧的配对时间中的至少一个之间。最终结果本质上是list1,score 列中的 0 将不落入任何窗口的时间瞬间与落入的时间瞬间区分开来。
以下是一些示例数据:
set.seed(1)
list1 <- split(d<-replicate(10,1:100+rnorm(100,0,0.1)),
ceiling(seq_along(d)/100))
list1 <- lapply(list1, function(x) data.frame(cbind(time = x, score = 0)))
names(list1) <- letters[1:10]
list2 <- replicate(10, sample(1:100, sample(1:20), replace=FALSE))
list2 <- lapply(list2, function(x)
data.frame(cbind(x, x + sample(runif(100,min=0.1,max=3),length(x)))))
names(list2) <- letters[1:10]
我能够拼凑出一两个适用于小示例的解决方案,但是当我在更大的列表中尝试它时(即真实的 list1 中的几百万个时间瞬间),我遇到了内存错误。
首先,我做了一个函数来做我想做的给定两个适当的数据框
testfxn1 <-function(df1, df2)
{
df1<-lapply(1:dim(df2)[1], function(x)
{
df1[which(df1[1] > df2[x,1] & df1[1] < df2[x,2]), 2] <- 1
return(df1)
})
return(cbind(df1[[1]][1],
score = rowSums(do.call(cbind,lapply(df1,'[[',2)))))
}
然后,我使用sapply 将该函数应用于整个列表:
sapply(names(list1), simplify=FALSE, function(x) return(testfxn1(list1[[x]], list2[[x]])))
它做我想要的(即在数据不在相关时间窗口之间的情况下留下 0),但在我的真实数据中,list1 中有许多具有 250,000 - 750,000 个时间瞬间的数据帧,我无法分配足够的内存来完成任务。
关于如何更有效地完成此任务的任何想法?当然,我的testfxn1 中的第一个lapply 调用肯定是问题的很大一部分。
【问题讨论】:
标签: r list data-manipulation