4

それぞれ2列の10個のデータフレームがあり、データフレームをa、b、c、d、e、f、g、h、i、jと呼んでいます。

各データ フレームの最初の列はシーケンスの s と呼ばれ、2 番目の列は各シーケンスに対応する p 値の p と呼ばれます。s 列には、10 個のデータ フレームすべてで同じシーケンスが含まれています。基本的に唯一の違いは p 値です。以下は、600,000 行のデータ フレーム a の短いバージョンです。

s       p
gtcg    0.06
gtcgg   0.05
gggaa   0.07
cttg    0.05

各データフレームを p 値でランク付けしたい場合、最小の p 値はランク 1 になり、等しい p 値は同じランクになるはずです。各最終データ フレームは、次の形式にする必要があります。

    s       p_rank_a
    gtcg    2
    gtcgg   1
    gggaa   3
    cttg    1

私はこれを使って1つをしました:

r<-rank(a$p)

cbind(a$s,r)

しかし、私はループにあまり詳しくなく、これを自動的に行う方法がわかりません。最終的には、s 列があり、次の列に、特定のシーケンスごとにすべてのデータ フレームのすべてのランクのランク合計がある最終ファイルが必要です。SO基本的にこれ:

s       ranksum_P_a-j
gtcg    34
gtcgg   5
gggaa   5009093
cttg    499

助けてください、ありがとう!

4

2 に答える 2

2

すべてdata.framesを aに入れてから、次のようにandlistを使用します。lapplytransform

my_l <- list(a,b,c) # all your data.frames
# you can use rank but it'll give you the average in case of ties
# lapply(my_l, function(x) transform(x, rank_p = rank(p)))

# I prefer this method instead
my_o <- lapply(my_l, function(x) transform(x, p = as.numeric(factor(p))))

# now bind them in to a single data.frame
my_o <- do.call(rbind, my_o)

# now paste them
aggregate(data = my_o, p ~ s, function(x) paste(x, collapse=","))

#       s     p
# 1  cttg 1,1,1
# 2 gggaa 3,3,3
# 3  gtcg 2,2,2
# 4 gtcgg 1,1,1

(データが大きいため)潜在的なより高速なソリューションを求めたので編集data.tableしてください。@Ricardoのように、ソリューションをお勧めします。

require(data.table)
# bind all your data.frames together
dt <- rbindlist(my_l) # my_l is your list of data.frames

# replace p-value with their "rank"
dt[, p := as.numeric(factor(p))]

# set key
setkey(dt, "s")

# combine them using `,`
dt[, list(p_ranks = paste(p, collapse=",")), by=s]

これを試してください:

于 2013-03-30T21:37:56.207 に答える