我有一个像变量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。
表格数据中的第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,]))}
}
但这还不行。
答案 0 :(得分:1)
如果你一步一步地使用一些临时变量,你将省去很多麻烦,你的代码将变得更加清晰。
以下是我的建议:
另外两个观察结果:
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)))