在R中排列多个数据帧并对它们求和

时间:2013-03-30 21:26:36

标签: r sum ranking data-manipulation

我有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秩(A $ p)的

     

cbind(一个$ S,R)

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

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

请帮助和谢谢!

2 个答案:

答案 0 :(得分: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]

试试这个:

答案 1 :(得分:2)

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

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

我建议将所有data.frame保存在一个列表中,以便您可以轻松地对它们进行迭代。 由于你的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中的其他常见功能可能是一个很好的习惯。否则,你会发现在你击败你之后,你会遇到很多“无法解释的”行为 试着调试它,在墙上撞了一个小时,你意识到你已经覆盖了一个函数的名字。 这从未发生在我身上:))