我知道我应该可以在这里找到它,但是作为R的初学者,我遇到了麻烦。重定向到哪里寻找答案对我也很有帮助,因为我查看了许多其他应用函数,但我不理解它们。我有一个数据框“ y”,我想在其中遍历行,并使用这些行坐标从另一个数据框“ t”中获取一个p值。在python中,您可以遍历行并使用行索引。我现在也可以在R中执行此操作,但是速度很慢:
for (i in 1:nrow(y)) {
y$pvalue[i] <- min(t$pvalue[t$Start <= y$Start[i] & t$Stop >= y$Stop[i]])
}
如何使用“应用”之类的功能来加快速度?语法确实使我感到困惑。
一些播放数据:
t <- data.frame("Chromosome" = c(1,1,1,1,1,1,1), "Start" =
c(0,5,10,15,20,25,30), "Stop" = c(10,15,20,25,30,35,40),"pvalue" = c(0.1,0.4,0.3,0.8,0.6,0.3,0.1))
my_list <- union(t$Start, t$Stop)
y <- data.frame('Start' =my_list[1:length(my_list)-1], "Stop" = my_list[-1])
所以在这里我们有重叠的坐标,我试图从't'中获得最小的pvalue,该值与'y'中的bin匹配。
结果会像这样:
y <- data.frame('Start' =my_list[1:length(my_list)-1], "End" = my_list[-1], "pvalue" = c(0.1,0.1,0.3,0.3,0.6,0.3,0.1,0.1))
答案 0 :(得分:1)
我们可以在此处使用mapply
y$pvalue <- mapply(function(p, q) min(t$pvalue[t$Start <= p & t$Stop >= q]),
y$Start, y$Stop)
y
# Start Stop pvalue
#1 0 5 0.1
#2 5 10 0.1
#3 10 15 0.3
#4 15 20 0.3
#5 20 25 0.6
#6 25 30 0.3
#7 30 35 0.1
#8 35 40 0.1