4

我有 10 个数据框,每个数据框有 2 列,我将数据框称为 a、b、c、d、e、f、g、h、i 和 j。

每个数据帧中的第一列称为 s 用于序列,第二列称为 p 用于对应于每个序列的 p 值。s 列包含所有 10 个数据帧的相同序列,本质上唯一的区别在于 p 值。下面是数据框 a 的简短版本,它有 600,000 行。

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

我用它来做一个:

r<-rank(a$p)

cbind(a$s,r)

但我对循环不是很熟悉,也不知道如何自动执行此操作。最终,我想要一个具有 s 列的最终文件,在下一列中是每个特定序列的所有数据帧中所有等级的等级总和。所以基本上是这样的:

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

请帮忙,谢谢!

4

2 回答 2

2

我把所有的都data.frames放在一个list然后使用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

编辑,因为你已经要求一个潜在的更快的解决方案(由于大数据),我建议像@Ricardo,一个data.table解决方案:

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 回答
2

对于单个 data.frame,您可以一行完成,如下所示:
感谢@Arun 指出使用as.numeric(factor(p))

library(data.table)
aDT <- data.table(a)[, p_rank := as.numeric(factor(p))]

我建议将所有 data.frames 保存在一个列表中,以便您可以轻松地遍历它们。由于您的 date.frames 是字母,因此很容易收集其中的十个:

# collect them all
allOfThem <- lapply(letters[1:10], get, envir=.GlobalEnv)   
# keep in mind you named an object `c`

# convert to DT and create the ranks
allOfThem <- lapply(allOfThem, function(x) data.table(x)[, p_rank := as.numeric(factor(p))])

单独说明:开始避免命名对象“ c”和R. 否则,您会发现您将开始遇到许多“无法解释”的行为,在您将头撞到墙上尝试调试它一个小时后,您会意识到您已经覆盖了函数的名称。 这从来没有发生在我身上:)

于 2013-03-30T22:39:13.113 回答