2013-03-30 3 views
4

У меня есть 10 кадров данных с двумя столбцами каждый, я вызываю dataframes a, b, c, d, e, f, g, h, i и j.ранжирование нескольких кадров данных и суммирование по ним в R

Первый столбец в каждом кадре данных называется s для последовательностей, а второй - p для p-значений, соответствующих каждой последовательности. Столбец s содержит одни и те же последовательности во всех 10 кадрах данных, по существу единственное различие в p-значениях. Ниже представлена ​​короткая версия кадра данных a, которая имеет 600 000 строк.

s  p 
gtcg 0.06 
gtcgg 0.05 
gggaa 0.07 
cttg 0.05 

Я хочу, чтобы ранжировать каждый dataframe по р-значение, наименьшее значение р должно получить ранг 1 и равные р-значения должны получить одинаковый ранг. Каждый кадр данных Окончательный должен быть в следующем формате:

s  p_rank_a 
    gtcg 2 
    gtcgg 1 
    gggaa 3 
    cttg 1 

Я использовал это, чтобы сделать одну:

< г -ранга (а $ р)

cbind (а $ s , r)

но я не очень хорошо знаком с циклами, и я не знаю, как это сделать автоматически. В конце концов, мне бы хотелось, чтобы последний файл имел столбец s и в следующем столбце сумму рангов всех рангов во всех кадрах данных для каждой конкретной последовательности. SO основном это:

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

Пожалуйста, помогите и спасибо!

+0

Не должен ли ранг 'gggaa' быть 4 вместо 3? –

ответ

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 

Edit, так как вы просили потенциальное быстрее решения (из-за большой объем данных), Я хотел бы предложить, как @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] 

Попробуйте это:

+0

еще раз спасибо. Я буду использовать это с другим, на который вы ответили, и объедините их. эти кадры данных составляют от 600 000 до 2,4 млн. строк в длину, знаете ли вы о более быстрой программе, которую я мог бы использовать. Я немного знаю python, но это примерно – CadisEtRama

+0

@ user1181213, попробуйте отредактировать. – Arun

+0

спасибо, я только что сделал. – CadisEtRama

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))]) 

на отдельной ноте: это может быть хорошим Habbit, чтобы начать избегать именования объектов «c» и другие общие функции в R. в противном случае вы обнаружите, что начнете сталкиваться со многими «необъяснимыми» поведением, которые после того, как вы наткнули голову на стену в течение часа, пытаясь ее отладить, вы понимаете, что вы перезаписали имя функции.Это никогда не случалось со мной :)

+0

Я не уверен, что здесь 'порядок (ранг (p))'. для ex: если 'p = c (0.06, 0.05, 0.07, 0.05)', тогда 'rank (p) = c (3, 1.5, 4, 1.5)' и 'order (.) = 2,4,1, 3 ', тогда как желаемый результат равен «2,1,3,1'. И 'order (p)' совпадает с порядком (rank (p)) ' – Arun

+1

@Arun, вы абсолютно правы. В голове я думал «пол (ранг (р))», но даже это было бы не совсем правильно. Я отредактировал свой ответ. –

Смежные вопросы