我有一个包含整数的数据框。 例如:
start stop strand
1 10 +
3 8 +
11 9 +
我想将开始和停止的值切换到第三行,以及将链从“+”更改为“ - ”。
编辑:这是功能。
strandFun <- function(x){
if(x[2] > x[1])
{
return("+")
} else {
return("-")
}
}
apply(df, 1, strandFun)
然后使用cbind()
将其放入我的数据框中。
要在start更大时切换值,请停止我使用:
start[start>stop] <- stop
stop <- abs(stop)
但在这里我收到以下错误:
“要替换的项目数不是替换长度的倍数”
有没有一种奇特的方法来解决我的问题?
答案 0 :(得分:2)
只需在建立索引后使用一些基本的分配调用,以查看stop
是否小于或等于start
sel <- with(df, stop <= start)
df[sel,c("start","stop")] <- df[sel,c("stop","start")]
df[sel,c("strand")] <- "-"
# start stop strand
#1 1 10 +
#2 3 8 +
#3 9 11 -
此处使用的df
是:
df <- read.table(text="start stop strand
1 10 +
3 8 +
11 9 +",header=TRUE,stringsAsFactors=FALSE)
答案 1 :(得分:2)
使用data.table
:
require(data.table)
dt[start > stop, names(dt) := list(stop, start, "-")]
# start stop strand
# 1: 1 10 +
# 2: 3 8 +
# 3: 9 11 -
dt
如下所示。
相反,如果您想反转该股,那么:
dt[start > stop, names(dt) := list(stop, start, ifelse(strand == "+", "-", "+")]
dt = fread('start stop strand
1 10 +
3 8 +
11 9 +')
答案 2 :(得分:1)
library(dplyr)
df.ID = df %>% mutate(ID = 1:n())
df.unchanged = df.ID %>% filter(start <= stop)
result =
df.ID %>%
filter(start > stop) %>%
mutate(strand = "-",
old_start = start,
start = end,
end = old_start) %>%
select(-old_start) %>%
bind_rows(df.unchanged) %>%
arrange(ID)