1

我有以下数据

一个 1 6
2 72
一个 3 90
4 81
5 81
6 42
一个 7 12
一个 8 32
9 34
10 92
乙 1 44
乙 2 54
乙 3 10
乙 4 21
乙 5 47
乙 6 35
乙 7 94
乙 8 5
乙 9 35
乙 10 77
乙 11 9
乙 12 52
乙 13 73
乙 14 93
乙 15 38
乙 16 85
乙 17 90
乙 18 47

我的输出必须是

一个 1 6 1
2 72 1
一个 3 90 2
4 81 2
5 81 3
6 42 3
一个 7 12 4
一个 8 32 4
一个 9 34 5
10 92 5
乙 1 44 1
乙 2 54 1
乙 3 10 1
乙 4 21 1
乙 5 47 1
乙 6 35 2
乙 7 94 2
乙 8 5 2
乙 9 35 2
乙 10 77 3
乙 11 9 3
乙 12 52 3
乙 13 73 3
乙 14 93 4
乙 15 38 4
乙 16 85 4
乙 17 90 4
乙 18 47 4

bin(last) 列必须根据第一列中项目的长度计算。因此,对于每个 bin 中的 A= 10/5 = 2

对于 B,每个 bin 中的 18/5 = 3.6....

我尝试使用 seq bin = seq(from=, to=, by=) 但不知道如何继续。任何帮助,将不胜感激。谢谢

4

3 回答 3

2

您可以按照此处的方法,使用ave将函数应用于数据中的每个组。

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
于 2015-07-20T20:33:03.740 回答
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
于 2015-07-21T22:44:08.213 回答
0

我试过这个

    分裂(df,df$Gene)-> 基因
    基因[1] -> g
    as.data.frame(g)->g1


    FindBin = 函数(数据){
    开始=0
    END=长度(g1$A.Base)
    noOfBin=20
    跳转=END/noOfBin
    bin = seq(from=START, to=END, by=jump)
    g1$bin_index = findInterval(g1$A.Base, bin)
    }
    g1$m1bin=查找bin(g1)

现在,我得到了垃圾箱..但是由于我已经将 df 拆分为不同的基因,如何在所有拆分的 df 上运行它

于 2015-07-20T20:35:15.180 回答