R:计算相对距离

时间:2011-05-20 07:59:13

标签: r dataframe

我有一个像变量x的数据框。

x<-"start.x    stop.x strand.x   start.y    stop.y strand.y
1  16954189  16963562        -  16954189  16963562        -
2  16954189  16963562        - 150045170 150065177        -
3 150045170 150065177        -  16954189  16963562        -
4 150045170 150065177        - 150045170 150065177        -
5  97061519  97190927        -  97061519  97190927        -
6  97061519  97190927        - 135190856 135202610        +
7 135190856 135202610        +  97061519  97190927        -
8 135190856 135202610        + 135190856 135202610        +"

dat <- read.table(textConnection(x), header=TRUE)

通常我使用以下代码计算每一行start.x和start.y之间的相对距离:

zz <- transform(x, 
  distance_startsite = abs(as.numeric(start.x) - as.numeric(start.y)))

但在计算这段时间之前,我们首先需要查看strand.x和strand.y。

  • 如果strand.x是“ - ”,则官方起始站点为stop.x
  • 如果strand.x为“+”,则官方起始网站为start.x
  • 如果strand.y为“ - ”,则官方起始网站为stop.y
  • 如果strand.y为“+”,则官方起始网站为start.y

表格数据中的第1行必须按此计算:abs(as.numeric(stop.x) - as.numeric(stop.y)而不是abs(as.numeric(start.x) - as.numeric(start。 Y)。

我的问题是,有没有办法计算每行如zz?

谢谢

编辑:我的第一个想法是这样的:

for (i in 1:nrow(dd)){
if (dat$strand.x[i,] == "-" & dat$stand.y[i,] == "-") {
  result[i]<-transform(dat,distance_startsite[i] = abs(as.numeric(stop.x[i,]) - as.numeric(stop.y[i,]))} else
if (dat$strand.x[i,] == "+" & dat$stand.y[i,] == "-") {
  result[i]<-transform(dat,distance_startsite[i] = abs(as.numeric(start.x[i,]) - as.numeric(stop.y[i,]))} else
if (dat$strand.x[i,] == "-" & dat$stand.y[i,] == "+") {
  result[i]<-transform(dat,distance_startsite[i] = abs(as.numeric(stop.x[i,]) - as.numeric(start.y[i,]))} else
if (dat$strand.x[i,] == "+" & dat$stand.y[i,] == "+") {
  result[i]<-transform(dat,distance_startsite[i] = abs(as.numeric(start.x[i,]) - as.numeric(start.y[i,]))} 
 }

但这还不行。

2 个答案:

答案 0 :(得分:1)

如果你一步一步地使用一些临时变量,你将省去很多麻烦,你的代码将变得更加清晰。

以下是我的建议:

  1. 添加包含起始值和停止值的列(使用您的条件)
  2. 计算绝对差值
  3. 另外两个观察结果:

    • 您的起始值和结束值是整数值,因此您无需一直使用as.numeric
    • 在您的原始问题中,您对起始网站的条件存在冲突,但没有停止网站的条件,因此我猜测了您的真实含义。

    代码:

    dat$start <- with(dat, ifelse(strand.x=="+", start.x, stop.x))
    dat$stop  <- with(dat, ifelse(strand.y=="+", start.y, stop.y))
    dat$dist  <- with(dat, abs(stop-start))
    

    结果:

    dat
    
        start.x    stop.x strand.x   start.y    stop.y strand.y      dist
    1  16954189  16963562        -  16954189  16963562        -         0
    2  16954189  16963562        - 150045170 150065177        - 133101615
    3 150045170 150065177        -  16954189  16963562        - 133101615
    4 150045170 150065177        - 150045170 150065177        -         0
    5  97061519  97190927        -  97061519  97190927        -         0
    6  97061519  97190927        - 135190856 135202610        +  37999929
    7 135190856 135202610        +  97061519  97190927        -  37999929
    8 135190856 135202610        + 135190856 135202610        +         0
    

答案 1 :(得分:1)

我倾向于同意@Andrie,但如果你真的想要一个'单行解决方案'(很好):

zz <- transform(dat, distance_startsite = abs(ifelse(strand.x=="+", start.x, stop.x)-ifelse(strand.y=="+", start.y, stop.y)))