2015-01-27 3 views
-1

Я хочу отфильтровать группу кадров данных, сначала с помощью p.value, а затем разделить ее на две на значение t.Зацикливание нескольких кадров данных с использованием R

Вот как я делаю это только для одного кадра данных.

p.value.cut <- which(top_Na1$P.Value < 0.05) 
top_Na1 <- top_Na1[p.value.cut,]  

up <- which(top_Na1$t > 0) 
down <- which(top_Na1$t < 0) 

up.p.value <- top_Na1[up,] 
down.p.value <- top_Na1[down,] 

Всякий раз, когда я пытаюсь повторить это с помощью цикла для или apply, sapply, lapply я заканчиваю применение изменений ко всем столбцам или не в состоянии работать с соответствующей колонкой (это выглядит как цикл не использует весь кадр данных, но он идет по столбцу по столбцу), или я просто теряю имена строк фрейма данных (например, с некоторыми apply).

Вот как выглядит один из кадров данных (все одинаковы).

   logFC   t  P.Value adj.P.Val   B 
YMR290C -0.1952028 -4.593506 0.003484478 0.03596870 -1.602151 
YBR090C -0.3406244 -4.373073 0.004429437 0.03930581 -1.857238 
YPL037C -0.8737048 -4.088782 0.006100105 0.04526780 -2.197584 
YGL035C -0.3058778 -3.839335 0.008159371 0.05142077 -2.506721 
+2

Вы не указали код, который вы пытались применить на всех ваших кадрах данных. Обычно хорошим способом применения одного и того же кода в наборе данных является сохранение их в списке, например. 'l <- list (df1, df2, df3)', а затем примените вашу функцию обработки к списку с помощью 'lapply (l, process)'. – josliber

+0

@ biorunner88 Я бы также предложил читать все data.frames в список, а не создавать отдельные объекты data.frame. то есть. 'files <- list.files(); lst <- lapply (файлы, read.table, header = TRUE) '. Тогда попробуйте, как предположил Josiber – akrun

ответ

0

Предположим, что «/tmp/dat.txt» содержит ваш образец data.frame. Код ниже должен делать то, что вы хотите.

d <- read.table("/tmp/dat.txt") 
d[1,"P.Value"] <- 0.05 # to make the example more general 
d[2,"t"] <- -d[2,"t"] # to make the example more general 
input <- list(d,d) # generating a list of data frames for testing purposes 

cutIt <- function(x) { 
    y <- x[x$P.Value < 0.05,] 
    list(up=y[y$t > 0,],down=y[y$t <= 0,]) 
} 

lapply(input,cutIt) 
1

Спасибо. Он решен. Проблема была в том, как я создавал список.

Этот способ работал.

l <- list(top_Na1, top_Na2) 

function_filtering <- function(x){ 
    p.value.cut <- which(x$P.Value < 0.05) 
    x <- x[p.value.cut,]  

    up <- which(x$t > 0) 
    down <- which(x$t < 0) 

    up.p.value <- x[up,] 
    down.p.value <- x[down,] 

    } 

    lapply(l, function_filtering) 
Смежные вопросы