Как удалить строки в кадре данных на основе значений другого кадра данных

Я пытаюсь отфильтровать строки в своем фрейме данных (MainData) на основе критериев p-значений в другом фрейме данных (PvalueData). Итак, я хочу: если более 50% столбцов в строке имеют значение p > 0,05 (PvalueData), то эта конкретная строка будет удалена из основного фрейма данных (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

PvalueДанные:

        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)

Но не могу разобраться.


person Letin    schedule 29.06.2016    source источник
comment
добавьте dput ваших данных или пример данных   -  person user5249203    schedule 29.06.2016


Ответы (3)


Вот ответ с использованием 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 в матрицу, состоящую из логических элементов (ИСТИНА и ЛОЖЬ), где элемент является ИСТИНА, если он соответствует вашему критерию p-значения.
  • rowMeans вычисляет среднее значение этих логических значений для каждой строки.
  • Эти средства используются для подмножества основного кадра данных в соответствии со вторым критерием.

данные

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")
person lmo    schedule 29.06.2016
comment
Виноват. Я пропустил 0,5, я думал, что это 0,05. Хорошее решение :). - person LyzandeR; 29.06.2016

Возможно, не самый эффективный способ, но в базе 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")
person LyzandeR    schedule 29.06.2016

Вот что вы можете сделать, используя 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.

ДАННЫЕ

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"))
person 989    schedule 29.06.2016