R - Сворачивание строк фрейма данных с вычислениями в столбце - PullRequest
1 голос
/ 05 мая 2020

У меня есть фрейм данных, который выглядит примерно так

sampleDF <- data.frame(entrezgene_id = c(rep(1, 20), rep(10, 25), rep(100, 5)),
                       ensembl_gene_id = c(rep("a", 7), rep("b", 8), rep("c", 7),
                                           rep("d", 8), rep("e", 15),
                                           rep("f", 2), rep("g", 2), rep("h", 1)),
                       transcript_length = sample(500:10000, 50))

Я хотел бы иметь возможность свернуть его примерно так

entrezgene_id   ensembl_gene_id medianTranscriptLength
            1                 a                   5795
            1                 b                   4981
            1                 c                   6526
           10                 c                   2307
           10                 d                   5044
           10                 e                   6069
          100                 f                   8669
          100                 g                 6570.5
          100                 h                   6997

, где он перебирает каждый элемент в первом столбце и для каждого элемента во втором столбце вычисляет медианное значение соответствующих значений в третьем столбце. Я сделал это сейчас, создав еще один фрейм данных, где второй столбец является ключевым. Но затем из-за того, что дубликаты во втором столбце перекрываются с несколькими записями первого столбца (например, см. Ensembl_gene_id «c» в моем примере), мне пришлось создать еще один фрейм данных, в котором я сгладил entrezgene_id столбец. Я уверен, что должен быть более короткий способ сделать это. Это кажется достаточно простым, но я не знаю, как это сделать. Буду очень признателен за помощь.

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Мы могли бы использовать aggregate из base R

aggregate(transcript_length ~ ., sampleDF, median)
1 голос
/ 05 мая 2020

В качестве альтернативы рассмотрите возможность использования tapply:

tapply(sampleDF$transcript_length, list(sampleDF$entrezgene_id, sampleDF$ensembl_gene_id), median)
       a    b      c      d    e      f      g    h
1   7059 3972 2709.0     NA   NA     NA     NA   NA
10    NA   NA 5826.5 3573.5 6797     NA     NA   NA
100   NA   NA     NA     NA   NA 2749.5 3335.5 6291

Результаты отображаются еще более кратко.

...