【发布时间】:2016-03-23 23:10:21
【问题描述】:
我正在尝试实现一个函数来根据另一个表从一个表中获取值。实际的数据帧有 > 50,000 个观察值,所以实现这个嵌套的 for 循环是无效的。在过去的几天里,我一直试图通过 SO 来寻找一些有用的东西,但一直没能找到。我的数据没有特定的顺序(个人、细分等),因此即使出现问题,它也需要能够工作。
以下是我可以使用的数据的玩具示例:
region_map <- data.frame(Start = c(721290, 1688193), End= c(1688192, 2926555))
individual <- c("Ind1","Ind2","Ind3","Ind4")
segment <- data.frame(SampleID = c("Ind1","Ind1","Ind2","Ind2","Ind3","Ind3","Ind4","Ind4","Ind4"),
Start = c(721290, 1688194, 721290, 1688200, 721290, 2926600, 721290, 1688193, 690),
End = c(1688192, 2926555,1688190, 2900000, 2926555, 3000000, 1500000, 2005000, 500000),
State = c(1,2,2,5,4,2,2,6,5))
这是我正在尝试做的一个简化示例:
Generate.FullSegmentList <- function(segments, individuals, regionmap){
FullSegments <- data.frame()
for(region in 1:nrow(regionmap)){
for(ind in individuals){
# If there is not a segment within that region for that individual
if(nrow(
segments[segments$start >= regionmap$Start[region] &
segments$End <= regionmap$End[region] &
segments$SampleID == ind , ]
) == 0){
Temp <- data.frame(SampleID = ind,
Start = regionmap$Start[region],
End = regionmap$End[region],
State = 3
)
}
# If there is a segment within that region for that individual
if(nrow(
segments[segments$Start >= regionmap$Start[region] &
segments$End <= regionmap$End[region] &
segments$SampleID == ind , ]
) == 1){
Temp <- data.frame(SampleID = segments$SampleID,
Start = regionmap$Start[region],
End = regionmap$End[region],
State = segments$State[segments$Start >= regionmap$Start[region] &
segments$SampleID == ind ]
)
}
FullSegments <- list(FullSegments, Temp)
}
}
FullSegments
}
换句话说,我需要查看每个区域 (~53,000) 并为每个 individual 的区域分配一个值(State,如果不存在,则赋予值 3),然后创建一个新数据.frame 与每个地区的每个人。为此,我遍历区域和个体,找到与区域重叠的 segment(其中有大约 25,000 个),然后将其附加到表中。
以下是上述玩具数据的输出结果:
SampleID Start End State
Ind1 721290 1688192 1
Ind1 1688193 2926555 2
Ind2 721290 1688192 2
Ind2 1688193 2926555 5
Ind3 721290 1688192 4
Ind3 1688193 2926555 4
Ind4 721290 1688192 2
Ind4 1688193 2926555 6
这个函数完全按照我的需要工作,除了它需要很长时间才能运行(使用 system.time,我知道它需要 3 个多月的时间才能运行)。我知道必须有更好的方法来做到这一点。我已经尝试实现应用函数,并且在其他一些问题中看到使用列表而不是 data.frame。我还看到有 data.table 和 plyr 选项可以简化这一点。我已经尝试过这些方法,但未能成功使其与带有 if 语句的嵌套循环一起工作。
我会很感激任何答案的解释,因为这是我第一次写这么复杂的东西。
我认为相关的问题:
关于嵌套 for 循环的许多其他问题涉及执行适用于执行应用函数的计算(例如 apply(df, 1, function(x){ mean(x) }),但我无法采用它来将值从 data.frame 映射到 data.frame。
【问题讨论】:
标签: r