R:在数据帧中查找和反转间隔,然后在更改时报告

时间:2015-10-18 23:27:20

标签: r

我有一个包含整数的数据框。 例如:

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)

但在这里我收到以下错误:

“要替换的项目数不是替换长度的倍数”

有没有一种奇特的方法来解决我的问题?

3 个答案:

答案 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)