R数据帧计算两列之间的值数并创建新列

时间:2015-07-22 04:36:49

标签: r dataframe

假设您有一个数据框:

TF_name  L  R
      A  1  5
      B 10 15
      C 17 18

以这种方式操纵它的最佳方法是什么?

TF_name  Position
      A         1
      A         2
      A         3
      A         4
      A         5
      B        10
      B        11
      B        12
      B        13
      B        14
      B        15
      C        17
      C        18

编辑:我一直在尝试所有答案,但似乎没有一个在这个特定的数据框v上工作。我创建数据框的方式是为什么这些方法不起作用?

f <- 'GADANCGGCCTAGATGTGAT'

motifs = c('GA','GC','CT','AG','AT')

v <- na.omit(data.frame(do.call(rbind, lapply(stri_locate_all_regex(f, motifs), unlist))))
v <- data.frame(v,Legend=na.omit(unlist(stri_extract_all_regex(f,motifs))))
v <- v[order(v[,1]),]
v <- v[c(3,1,2)]

organizer <- function(df,tracknom) {
  names(df)<-c("V1","V2","V3")
  newdf <- data.frame(
    Name=rep(df$V1, df$V3-df$V2 + 1),
    Track=tracknom,
    Position=unlist(mapply(seq, df$V2, df$V3))
  )
  newdf
}

v <- organizer(v,1)
v
   Name Track Position.1 Position.2 Position.3 Position.4 Position.5 Position.6 Position.7 Position.8
1    GA     1          1          8         10         12         13         14         18         19
2    GA     1          2          9         11         13         14         15         19         20
3    GC     1          1          8         10         12         13         14         18         19
4    GC     1          2          9         11         13         14         15         19         20
5    CT     1          1          8         10         12         13         14         18         19
6    CT     1          2          9         11         13         14         15         19         20
7    AG     1          1          8         10         12         13         14         18         19
8    AG     1          2          9         11         13         14         15         19         20
9    GA     1          1          8         10         12         13         14         18         19
10   GA     1          2          9         11         13         14         15         19         20
11   AT     1          1          8         10         12         13         14         18         19
12   AT     1          2          9         11         13         14         15         19         20
13   GA     1          1          8         10         12         13         14         18         19
14   GA     1          2          9         11         13         14         15         19         20
15   AT     1          1          8         10         12         13         14         18         19

2 个答案:

答案 0 :(得分:2)

尝试

databasehelperhome mHelper = new databasehelperhome(this);
mHelper.open();

更新

library(data.table)#v1.9.4+
setDT(df1)[, list(Position=L:R), TF_name] 
#   TF_name Position
# 1:       A        1
# 2:       A        2
# 3:       A        3
# 4:       A        4
# 5:       A        5
# 6:       B       10
# 7:       B       11
# 8:       B       12
# 9:       B       13
#10:       B       14
#11:       B       15
#12:       C       17
#13:       C       18

答案 1 :(得分:1)

基础R中的一种方式(使用mapply将开始/结束值提供给seq;加入;使用rep使TF_name向右移动长度)。

newdf <- data.frame(
  TF_name=rep(df$TF_name, df$R-df$L+1),
  Position=unlist(mapply(seq, df$L, df$R, SIMPLIFY=F))
)

使用plyr的另一种方式:

library(plyr)
ddply(df, .(TF_name), summarize, Position=seq(L, R))

我确定还有更多 - 你的选择真的。

更新以回应问题更改....

同样的事情,只需更改列名称即可。另外,在SIMPLIFY=F调用中使用明确的mapply,恰好所有的结尾都比你的开头多1个mapply将结果简化为矩阵而不是列表,导致unlist无所作为。

(这次我添加了with,但这是因为我懒得在所有内容前面输入v$。你可以省略并{{1}等等,如果你喜欢)。

v$start