簡體   English   中英

R數據幀計算兩列之間的值數並創建新列

[英]R Data Frame Counting number of values between two columns and creating new column

假設您有一個數據框:

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

嘗試

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

更新

 setDT(v)[, list(Position=start:end), .(Legend, 1:nrow(v))][,nrow:= NULL][]
 #    Legend Position
 #1:     GA        1
 #2:     GA        2
 #3:     GC        8
 #4:     GC        9
 #5:     CT       10
 #6:     CT       11
 #7:     AG       12
 #8:     AG       13
 #9:     GA       13
 #10:    GA       14
 #11:    AT       14
 #12:    AT       15
 #13:    GA       18
 #14:    GA       19
 #15:    AT       19
 #16:    AT       20

基礎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))

我相信還有更多 - 你的選擇真的。


更新以回應問題變更....

同樣的事情,只需更改列名稱。 此外,在mapply調用中使用顯式SIMPLIFY=F ,恰好所有的結尾都比啟動時多1個,因此mapply將結果簡化為矩陣而不是列表,導致unlist

(這時候我加了一個with ,但那是因為我懶得打字v$眼前的一切,你可以省略,做v$start等,而不是如果你喜歡)。

with(v,
  data.frame(
    Legend=rep(Legend, end-start+1),
    Position=unlist(mapply(seq, start, end, SIMPLIFY=F))
  )
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM