遍历行

时间:2018-11-26 13:00:05

标签: r loops

我知道我应该可以在这里找到它,但是作为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))

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