【问题标题】:R: Calculate the relative distanceR:计算相对距离
【发布时间】:2011-05-20 07:59:13
【问题描述】:

我有一个像变量 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

表 dat 中的第 1 行必须计算: abs(as.numeric(stop.x) - as.numeric(stop.y) 而不是 abs(as.numeric(start.x) - as.numeric(start.x) 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,]))} 
 }

但这还不行。

【问题讨论】:

  • 您的起始站点和停止站点的条件语句对起始站点的要求有冲突,并且没有指定终止站点。

标签: r dataframe


【解决方案1】:

如果你一步一步地做这件事,并使用一些临时变量,你会为自己省去很多麻烦,你的代码也会变得更清晰。

这是我的建议:

  1. 添加包含开始值和停止值的列(使用您的条件)
  2. 计算绝对差

两个进一步的观察:

  • 您的开始和停止值是整数值,因此您不需要一直使用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

【讨论】:

  • 感谢安德烈!该解决方案非常有帮助!
【解决方案2】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多