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

Хотя есть много подобных вопросов, я не смог найти ответ на этот вопрос конкретно в R, поэтому я не уверен, с чего начать.У меня есть 2 набора данных:

Данные1:

Chr Start   End   rssnp1        Type    gene
1   1244733 1244734 rs2286773   LD_SNP  ACE
1   1257536 1257436 rs301159    LD_SNP  CPEB4
1   1252336 1252336 rs2286773   Sentinel    CPEB4
1   1252343 1252343 rs301159    LD_SNP  CPEB4
1   1254841 1254841 rs301159    LD_SNP  CPEB4
1   1256703 1267404 rs301159    LD_SNP  CPEB4
1   1269246 1269246 rs301159    LD_SNP  CPEB4
1   1370168 1370168 rs301159    LD_SNP  GLUPA1
1   1371824 1371824 rs301159    LD_SNP  GLUPA1
1   1372591 1372591 rs301159    LD_SNP  GLUPA1

Данные2:

    gene
    CPEB4
    GML
    TBX2
    PNKD
    JMJD1C
    SKI
    MYH11

Данные2 - это результат машинного обучения (гены, классифицированные как влияющие на заболевание)).

Я ищу, чтобы выбрать ген из Data2, найти его в Data1 и, в частности, найти строку гена, которая имеет столбец Type как «Sentinel», а затем отфильтровать Data1 на основе столбца rssnp1 генов стража.

Например, если я искал ген CPEB4 из Data1 и нашел его ген Sentinel rssnp1 (rs2286773) для фильтрации по выходным данным:

Chr Start   End    rssnp1       Type     gene
1   1243933 1243934 rs2286773   LD_SNP  ACAP3
1   1254436 1254436 rs2286773   Sentinel    CPEB4

Пока я смотрел на использованиеmerge, filter () и subset (), но так как у меня много шагов, я должен пытаться использовать их в цикле for?Есть ли более эффективные функции для этого?

Я новичок в R, поэтому не проделал большую работу, например, я попытался объединить наборы данных:

merged <- merge(data1, data2, by='gene', all='TRUE')

Это работает с затем впросто превосходите фильтрацию вручную, но в идеале я бы хотел еще больше автоматизировать эту работу, поэтому любые советы / помощь в правильном направлении будут оценены.

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Я предполагаю, что вы хотели бы передать каждый ген из data2 и получить соответствующие данные из data1.Я надеюсь, что приведенный ниже код поможет.

library(dplyr)
getFromData1 <- function(geneFromData2 = NULL) {
  if (is.null(geneFromData2)) return()
  geneSentinelSNP <- (data1 %>% filter(Type == "Sentinel" & gene == geneFromData2))$rssnp1
  data1 %>% filter(rssnp1 == geneSentinelSNP)
}

getFromData1(geneFromData2 = "CPEB4")

Вы также можете вызвать функцию getFromData1 в lapply, чтобы получить список фреймов данных, по одному для каждого гена, из data2.

lapply(data2$gene, getFromData1)
1 голос
/ 09 мая 2019

Можно сделать группу по 'rssnp1' после значений full_join и filter для any как 'Sentinel' в 'Type'

library(dplyr)
full_join(data1, data2, by = 'gene') %>% 
     group_by(rssnp1) %>% 
     filter(any(Type == "Sentinel")) #or
     #filter("Sentinel" %in% Type)
# A tibble: 2 x 6
# Groups:   rssnp1 [1]
#    Chr   Start     End rssnp1    Type     gene 
#  <int>   <int>   <int> <chr>     <chr>    <chr>
#1     1 1244733 1244734 rs2286773 LD_SNP   ACE  
#2     1 1252336 1252336 rs2286773 Sentinel CPEB4

Или используя код OP, его можно расширить с помощью ave

i1 <-  with(merged, ave(Type %in% "Sentinel", rssnp1, FUN = any))
merged[i1,]

данные

data1 <- structure(list(Chr = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L
), Start = c(1244733L, 1257536L, 1252336L, 1252343L, 1254841L, 
1256703L, 1269246L, 1370168L, 1371824L, 1372591L), End = c(1244734L, 
1257436L, 1252336L, 1252343L, 1254841L, 1267404L, 1269246L, 1370168L, 
1371824L, 1372591L), rssnp1 = c("rs2286773", "rs301159", "rs2286773", 
"rs301159", "rs301159", "rs301159", "rs301159", "rs301159", "rs301159", 
"rs301159"), Type = c("LD_SNP", "LD_SNP", "Sentinel", "LD_SNP", 
"LD_SNP", "LD_SNP", "LD_SNP", "LD_SNP", "LD_SNP", "LD_SNP"), 
    gene = c("ACE", "CPEB4", "CPEB4", "CPEB4", "CPEB4", "CPEB4", 
    "CPEB4", "GLUPA1", "GLUPA1", "GLUPA1")),
    class = "data.frame", row.names = c(NA, 
-10L))

data2 <- structure(list(gene = c("CPEB4", "GML", "TBX2", "PNKD", "JMJD1C", 
"SKI", "MYH11")), class = "data.frame", row.names = c(NA, -7L
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...