Как фильтровать определенные строки в матрице данных для R, мои требования к фильтру немного сложны - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю с данными RNA seq с кластерами клеток в качестве первого столбца и экспрессией генов в верхней строке.Я хочу сравнить строки 1 и 2, 3 и 4, 5 и 6 и т. Д. Для конкретного столбца, чтобы увидеть, есть ли два уровня экспрессии.Все, что имеет два уровня экспрессии или высокий уровень, сохраняется, а все меньшее будет отфильтровано.Я хочу посмотреть на данные, где наблюдается относительное кратное изменение экспрессии генов.

Я пытался запустить этот код, но все еще получаю ошибки

GeneName    Cluster_1    Cluster_1   Cluster_2  Cluster_2 Cluster_3   Cluster_3
Itga9       0.019        0.004       0.028        0.020      0.053      0.045
Itga1       0.018        0.012       0.016        0.011      0.016       0.030
Npnt        0.000        0.000       0.000        0.000      0.000       0.000
Agrn        0.014        0.012       0.019        0.014      0.012       0.015
Cd36        0.028        0.107       0.035        0.037      0.030       0.074
Cd44        0.063        0.132       0.105        0.112      0.143       0.186
Chad        0.000        0.000       0.000        0.000      0.000       0.000        


My_Data <- My_Data[2:7,2:7] 
My_Data <- t(My_Data) foo = function(x) { 
if (length(x) %% 2 == 1) {
stop("Odd number of rows!")  
}  
 odd = seq(1, length(x), by = 2) 
 even = odd + 1   
 ratio = x[odd] / x[even]  
 return(any(ratio >= 2 |
 ratio <= 0.5)) } FilteredDf <- Filter(foo, My_Data)

По какой-то причине выдает ошибку: Ошибка в FUN (X [[i]], ...): Нечетное количество строк!

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Напишите функцию, которая выполняет тестирование в одном столбце и возвращает TRUE или FALSE, затем используйте Filter, чтобы применить ее к каждому столбцу в фрейме данных, и сохраните только TRUE s:

foo = function(x) {
  if (length(x) %% 2 == 1) {
    stop("Odd number of rows!")
  }
  odd = seq(1, length(x), by = 2)
  even = odd + 1
  ratio = x[odd] / x[even]
  return(any(ratio >= 2 | ratio <= 0.5))
}
Filter(foo, my_df)
#       a
# 1 0.000
# 2 0.000
# 3 4.020
# 4 2.004
# 5 1.001
# 6 0.004

Я оставлю на ваше усмотрение модификацию функции, которая может вам понадобиться (например, если введенное число строк нечетное).

Использование этих данных:

my_df <- read.table(text ='          a      b     c
1         0.000  0.001 0.883
2         0.000  0.001 1.471
3         4.020  0.003 1.357
4         2.004  0.004 1.618
5         1.001  0.005 1.110
6         0.004  0.006 1.048', header = TRUE)
0 голосов
/ 22 февраля 2019
require(dplyr)


my_df <- read.table(text ='a      b     c
         0.000  0.001 0.883
         0.000  0.001 1.471
         0.000  0.003 1.357
         10.004  0.004 1.618
         3.001  0.005 1.110
         0.004  0.006 1.048', header = TRUE)


## in the first step you will create a (duplicate) column tha shifts the rows upwards by 1

# the purpose is that you can apply functions horizontally 



my_df %>% 
  mutate(lead_a = lead(a)) %>%
  select(a, lead_a, b, c) %>%  
  head 


#       a lead_a     b     c
# 1  0.000  0.000 0.001 0.883
# 2  0.000  0.000 0.001 1.471
# 3  0.000 10.004 0.003 1.357
# 4 10.004  3.001 0.004 1.618
# 5  3.001  0.004 0.005 1.110
# 6  0.004     NA 0.006 1.048



# as you can see row 1 in lead_a is the same as row 2 in a !
# now you can compare row 1 to row2 3 to 4 etc...   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...