我有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
请帮助和谢谢!
答案 0 :(得分:2)
我将所有data.frames
放在list
中,然后使用lapply
和transform
,如下所示:
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
中的其他常见功能可能是一个很好的习惯。否则,你会发现在你击败你之后,你会遇到很多“无法解释的”行为
试着调试它,在墙上撞了一个小时,你意识到你已经覆盖了一个函数的名字。 这从未发生在我身上:))