【发布时间】: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,]))}
}
但这还不行。
【问题讨论】:
-
您的起始站点和停止站点的条件语句对起始站点的要求有冲突,并且没有指定终止站点。