R数据帧计算两列之间的值数并创建新列
假设您有一个数据帧:R数据帧计算两列之间的值数并创建新列,r,dataframe,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
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
f基R中的单向(使用mappy
为seq
提供起始值/结束值;连接在一起;使用rep
使TF_name
s的长度正确)
我敢肯定还有更多的,真的是你的选择
更新以响应问题更改
同样,只需更改列名。另外,在mapply
调用中使用显式的SIMPLIFY=F
,恰好所有的端点都比起点多1,因此mapply
将结果简化为矩阵而不是列表,导致未列出
什么也不做
(这次我用
添加了一个,但那是因为我懒得在所有东西前面键入v$
。如果你愿意,你可以省略并执行v$start
等操作)
试一试
更新
你可以从中得到一些想法。这是我想避免的错误。我刚刚测试了数学。咖啡的答案很好。是的,效果也很好,我只是想把它保存在data.frame中。你可以将结果包装到setDF
以转换为data.frame。或者像@Pascal那样漂亮的sequence
linked@Chani:你的编辑似乎改变了你的问题很多。通常情况下,回答原始问题(正确),然后根据问题的变化将其删除会有点混乱。好的,修复了。只需将SIMPLIFY=F
添加到mapply
。我已经解释了为什么会发生这种情况。
newdf <- data.frame(
TF_name=rep(df$TF_name, df$R-df$L+1),
Position=unlist(mapply(seq, df$L, df$R, SIMPLIFY=F))
)
library(plyr)
ddply(df, .(TF_name), summarize, Position=seq(L, R))
with(v,
data.frame(
Legend=rep(Legend, end-start+1),
Position=unlist(mapply(seq, start, end, SIMPLIFY=F))
)
)
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