【发布时间】:2016-11-02 21:31:27
【问题描述】:
我有一个 data.frame,其中包含 3 个名为 start、end 和 width 的列。每条线代表一维空间上的一段,有一个起点、终点和一个宽度,例如“width = end - start + 1”
这是一个例子
d = data.frame(
start = c(12, 50, 100, 130, 190),
end = c(16, 80, 102, 142, 201)
)
d$width = d$end - d$start + 1
print(d)
start end width
1 12 16 5
2 50 80 31
3 100 102 3
4 130 142 13
5 190 201 12
考虑两个断点和一个除法因子
UpperPos = 112
LowerPos = 61
factor = 2
我想减小两个断点外每个段的宽度,以便将它们的宽度减小factor 的系数。如果段与断点重叠,则只有该断点之外的段部分的宽度应减小。此外,每段的宽度必须是 3 的倍数,并且长度必须非零。
这是我当前的“挤压”段的函数
squeeze = function(d, factor, LowerPos, UpperPos)
{
for (row in 1:nrow(d))
{
if (d[row,]$end <= LowerPos | d[row,]$end >= UpperPos) # Complete squeeze
{
middlePos = round(d[row,]$start + d[row,]$width/2)
d[row,]$width = round(d[row,]$width / factor)
d[row,]$width = d[row,]$width - d[row,]$width %% 3 + 3
d[row,]$start = round(middlePos - d[row,]$width/2)
d[row,]$end = d[row,]$start + d[row,]$width -1
} else if (d[row,]$start <= LowerPos & d[row,]$end >= LowerPos) # Partial squeeze (Lower)
{
d[row,]$start = round(LowerPos - (LowerPos - d[row,]$start)/factor)
d[row,]$width = d[row,]$end - d[row,]$start + 1
if (d[row,]$width %% 3 != 0)
{
add = 3 - d[row,]$width %% 3
d[row,]$width = d[row,]$width + add
d[row,]$start = d[row,]$start - add
}
} else if (d[row,]$start >= UpperPos & d[row,]$end <= UpperPos) # Partial squeeze (Upper)
{
d[row,]$end = round(UpperPos + (d[row,]$end - UpperPos)/factor)
d[row,]$width = d[row,]$end - d[row,]$start + 1
if (d[row,]$width %% 3 != 0)
{
add = 3 - d[row,]$width %% 3
d[row,]$width = d[row,]$width + add
d[row,]$end = d[row,]$start + add
}
} else if (!(d[row,]$end < UpperPos & d[row,]$start > LowerPos) )
{
print(d)
print(paste("row is ",row))
print(paste("LowerPos is ",LowerPos))
print(paste("UpperPos is ",UpperPos))
stop("In MyRanges_squeeze: Should not run this line!")
}
}
return(d)
}
它会返回预期的输出
squeeze(d)
start end width
1 12 14 3
2 54 80 27
3 100 102 3
4 132 140 9
5 192 200 9
但是,我的函数squeeze 太慢了。你能帮我改进一下吗?
【问题讨论】:
-
尚未加快速度,但我认为您的第一个
if条件存在错误。不应该是if (d$end <= LowerPos | d$start >= UpperPos)吗?您有两个d$ends 但第二个应该是d$Start? -
对于第一行,
12, 16被压缩到12, 14。为什么只有end得到更新?为什么不是13, 15结果呢?与最后一行相比,190, 201被压缩到192, 200两者都得到更新。
标签: r performance dataframe segment