2016-06-29 3 views
2

Я пытаюсь отфильтровать строки в моем кадре данных (MainData) на основе критериев p-значений в другом фрейме данных (PvalueData). Итак, я хочу: если более 50% столбцов в строке имеет значение p> 0.05 (PvalueData), то эта конкретная строка будет удалена из основного фрейма данных (MainDatA).Как удалить строки в фрейме данных на основе значений другого фрейма данных

Позволяет сказать, вот данные у меня есть:

MainData:

 C1 C2 C3 C4 C5 
Gene1 70 54 54 75 75 
Gene2 23 18 16 54 15 
Gene3 43 93 90 43 92 
Gene4 32 50 23 13 45 
Gene5 44 53 46 34 47 
Gene6 42 34 53 85 43 
Gene7 49 55 67 49 89 
Gene8 25 45 49 34 35 
Gene9 19 16 54 53 94 

PvalueData:

 C1  C2  C3  C4  C5 
Gene1 0.04 0.01 0.01 0.01 0.01 
Gene2 0.01 0.01 0.01 0.02 0.01 
Gene3 0.01 0.07 0.09 0.01 0.06 
Gene4 0.01 0.03 0.06 0.01 0.02 
Gene5 0.04 0.01 0.07 0.08 0.01 
Gene6 0.09 0.07 0.01 0.06 0.06 
Gene7 0.10 0.07 0.01 0.01 0.06 
Gene8 0.01 0.01 0.02 0.01 0.01 
Gene9 0.09 0.01 0.07 0.08 0.06 

Так что мой результат файл должен выглядеть следующим образом:

Результат:

 C1 C2 C3 C4 C5 
Gene1 70 54 54 75 75 
Gene2 23 18 16 54 15 
Gene4 32 50 23 13 45 
Gene5 44 53 46 34 47 
Gene8 25 45 49 34 35 

я попробовать что-то вроде этого:

check = if (PvalueData[!rowSums(PvalueData>thres) > ncol(PvalueData)*.5], MainData) 

Но не может реально работать его.

+1

добавить 'dput' ваших данных или, например, данные – user5249203

ответ

5

Вот ответ, используя rowMeans:

df[rowMeans(df2 < 0.05) > 0.5,] 
     C1 C2 C3 C4 C5 
Gene1 70 54 54 75 75 
Gene2 23 18 16 54 15 
Gene4 32 50 23 13 45 
Gene5 44 53 46 34 47 
Gene8 25 45 49 34 35 

Вот быстрый распад коды:

  • df2 < 0.05 принуждает к data.frame в матрицу, состоящей из логических элементов (ИСТИНА и FALSE), где элемент TRUE, если он соответствует вашему критерию p-значения.
  • rowMeans вычисляет среднее значение этих логических значений для каждой строки.
  • Эти средства используются для подмножества основного data.frame в соответствии со вторым критерием.

данные

df <- read.table(header=T, text="C1 C2 C3 C4 C5 
Gene1 70 54 54 75 75 
Gene2 23 18 16 54 15 
Gene3 43 93 90 43 92 
Gene4 32 50 23 13 45 
Gene5 44 53 46 34 47 
Gene6 42 34 53 85 43 
Gene7 49 55 67 49 89 
Gene8 25 45 49 34 35 
Gene9 19 16 54 53 94") 

df2 <- read.table(header=T, text="C1  C2  C3  C4  C5 
Gene1 0.04 0.01 0.01 0.01 0.01 
Gene2 0.01 0.01 0.01 0.02 0.01 
Gene3 0.01 0.07 0.09 0.01 0.06 
Gene4 0.01 0.03 0.06 0.01 0.02 
Gene5 0.04 0.01 0.07 0.08 0.01 
Gene6 0.09 0.07 0.01 0.06 0.06 
Gene7 0.10 0.07 0.01 0.01 0.06 
Gene8 0.01 0.01 0.02 0.01 0.01 
Gene9 0.09 0.01 0.07 0.08 0.06") 
+1

Мой плохо. Я пропустил 0,5, я думал, что это 0,05. Хорошее решение :). – LyzandeR

3

Может быть, не самый эффективный способ, но в базе R можно использовать простой apply:

df1[apply(df2, 1, function(x) sum(x <= 0.05) >= 3), ] 
#  C1 C2 C3 C4 C5 
#Gene1 70 54 54 75 75 
#Gene2 23 18 16 54 15 
#Gene4 32 50 23 13 45 
#Gene5 44 53 46 34 47 
#Gene8 25 45 49 34 35 

По существу apply будет перебирать строки, и если сумма x < = 0,05 больше (или равна), чем 3, тогда возвращается TRUE в противном случае FALSE. Затем мы используем этот логический вектор для подмножества df1

данных

df1 <- read.table(text = "  C1 C2 C3 C4 C5 
Gene1 70 54 54 75 75 
Gene2 23 18 16 54 15 
Gene3 43 93 90 43 92 
Gene4 32 50 23 13 45 
Gene5 44 53 46 34 47 
Gene6 42 34 53 85 43 
Gene7 49 55 67 49 89 
Gene8 25 45 49 34 35 
Gene9 19 16 54 53 94") 

df2 <- read.table(text = "  C1  C2  C3  C4  C5 
Gene1 0.04 0.01 0.01 0.01 0.01 
Gene2 0.01 0.01 0.01 0.02 0.01 
Gene3 0.01 0.07 0.09 0.01 0.06 
Gene4 0.01 0.03 0.06 0.01 0.02 
Gene5 0.04 0.01 0.07 0.08 0.01 
Gene6 0.09 0.07 0.01 0.06 0.06 
Gene7 0.10 0.07 0.01 0.01 0.06 
Gene8 0.01 0.01 0.02 0.01 0.01 
Gene9 0.09 0.01 0.07 0.08 0.06") 
2

Это то, что вы могли бы сделать с помощью rowSums и subset:

subset(df, rowSums(df2>.05)<ceiling(ncol(df)/2)) 

     # C1 C2 C3 C4 C5 
# Gene1 70 54 54 75 75 
# Gene2 23 18 16 54 15 
# Gene4 32 50 23 13 45 
# Gene5 44 53 46 34 47 
# Gene8 25 45 49 34 35 

Держите те строки, которые меньше, чем 50% из p-значения больше, чем 0.05.

DATA

df <- structure(list(C1 = c(70L, 23L, 43L, 32L, 44L, 42L, 49L, 25L, 
19L), C2 = c(54L, 18L, 93L, 50L, 53L, 34L, 55L, 45L, 16L), C3 = c(54L, 
16L, 90L, 23L, 46L, 53L, 67L, 49L, 54L), C4 = c(75L, 54L, 43L, 
13L, 34L, 85L, 49L, 34L, 53L), C5 = c(75L, 15L, 92L, 45L, 47L, 
43L, 89L, 35L, 94L)), .Names = c("C1", "C2", "C3", "C4", "C5" 
), class = "data.frame", row.names = c("Gene1", "Gene2", "Gene3", 
"Gene4", "Gene5", "Gene6", "Gene7", "Gene8", "Gene9")) 

df2 <- structure(list(C1 = c(0.04, 0.01, 0.01, 0.01, 0.04, 0.09, 0.1, 
0.01, 0.09), C2 = c(0.01, 0.01, 0.07, 0.03, 0.01, 0.07, 0.07, 
0.01, 0.01), C3 = c(0.01, 0.01, 0.09, 0.06, 0.07, 0.01, 0.01, 
0.02, 0.07), C4 = c(0.01, 0.02, 0.01, 0.01, 0.08, 0.06, 0.01, 
0.01, 0.08), C5 = c(0.01, 0.01, 0.06, 0.02, 0.01, 0.06, 0.06, 
0.01, 0.06)), .Names = c("C1", "C2", "C3", "C4", "C5"), class = "data.frame", row.names = c("Gene1", 
"Gene2", "Gene3", "Gene4", "Gene5", "Gene6", "Gene7", "Gene8", 
"Gene9"))