我有以下数据
A 1 6 A 2 72 A 3 90 A 4 81 A 5 81 A 6 42 A 7 12 A 8 32 A 9 34 A 10 92 B 1 44 B 2 54 B 3 10 B 4 21 B 5 47 B 6 35 B 7 94 B 8 5 B 9 35 B 10 77 B 11 9 B 12 52 B 13 73 B 14 93 B 15 38 B 16 85 B 17 90 B 18 47
我的输出必须是
A 1 6 1 A 2 72 1 A 3 90 2 A 4 81 2 A 5 81 3 A 6 42 3 A 7 12 4 A 8 32 4 A 9 34 5 A 10 92 5 B 1 44 1 B 2 54 1 B 3 10 1 B 4 21 1 B 5 47 1 B 6 35 2 B 7 94 2 B 8 5 2 B 9 35 2 B 10 77 3 B 11 9 3 B 12 52 3 B 13 73 3 B 14 93 4 B 15 38 4 B 16 85 4 B 17 90 4 B 18 47 4
必须根据第一列中项目的长度计算bin(last)列。因此,每个箱子中A = 10/5 = 2
对于B,每个箱子中18/5 = 3.6 ....
我尝试使用seq bin = seq(from =,to =,by =) 但不知道如何继续。任何帮助,将不胜感激。谢谢
答案 0 :(得分:2)
您可以使用ave
按照here的方法,为您的数据中的每个群组应用该功能。
cbind(dat, bin=ave(dat$V2, dat$V1, FUN=function(x) ceiling(seq_along(x)/length(x)*5)))
# V1 V2 V3 bin
# 1 A 1 6 1
# 2 A 2 72 1
# 3 A 3 90 2
# 4 A 4 81 2
# 5 A 5 81 3
# 6 A 6 42 3
# 7 A 7 12 4
# 8 A 8 32 4
# 9 A 9 34 5
# 10 A 10 92 5
# 11 B 1 44 1
# 12 B 2 54 1
# 13 B 3 10 1
# 14 B 4 21 2
# 15 B 5 47 2
# 16 B 6 35 2
# 17 B 7 94 2
# 18 B 8 5 3
# 19 B 9 35 3
# 20 B 10 77 3
# 21 B 11 9 4
# 22 B 12 52 4
# 23 B 13 73 4
# 24 B 14 93 4
# 25 B 15 38 5
# 26 B 16 85 5
# 27 B 17 90 5
# 28 B 18 47 5
答案 1 :(得分:2)
使用data.table
:
setDT(x)[,output:=ceiling(5*(1:.N)/.N),by=V1]
> x
V1 V2 V3 output
1: A 1 6 1
2: A 2 72 1
3: A 3 90 2
4: A 4 81 2
5: A 5 81 3
6: A 6 42 3
7: A 7 12 4
8: A 8 32 4
9: A 9 34 5
10: A 10 92 5
11: B 1 44 1
12: B 2 54 1
13: B 3 10 1
14: B 4 21 2
15: B 5 47 2
16: B 6 35 2
17: B 7 94 2
18: B 8 5 3
19: B 9 35 3
20: B 10 77 3
21: B 11 9 4
22: B 12 52 4
23: B 13 73 4
24: B 14 93 4
25: B 15 38 5
26: B 16 85 5
27: B 17 90 5
28: B 18 47 5
V1 V2 V3 output
答案 2 :(得分:0)
我试过这个
split(df,df$Gene) -> gene gene[1] -> g as.data.frame(g) ->g1 FindBin = function(data){ START=0 END=length(g1$A.Base) noOfBin=20 jump=END/noOfBin bin = seq(from=START, to=END, by=jump) g1$bin_index = findInterval(g1$A.Base, bin) } g1$m1bin=FindBin(g1)
现在,我得到了垃圾箱..但是因为我将df拆分成不同的基因,如何在所有拆分df上运行它