![](/img/trans.png)
[英]Combining two columns in a data frame and creating a new column in an existing data frame in 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.