Табулируйте несколько уровней для каждого столбца в фрейме данных - PullRequest
0 голосов
/ 22 ноября 2018
> head(Gene)
  Key Func.ensGene Func.genericGene Func.refGene
1   1   intergenic       intergenic   intergenic
2   2   intergenic       intergenic   intergenic
3   3   intergenic       intergenic     intronic
4   4       exonic           exonic       exonic
5   5   intergenic       intergenic     intronic
6   6   intergenic       intergenic     intronic

Требуемый вывод:

Type          Func.ensGene Func.genericGene Func.refGene
exonic             1              1                1
intergenic         5              5                2
intronic           0              0                3

Решение, которое я пробовал, работает только с одним столбцом:

unique(Gene["Func.ensGene"])

Могу ли я получить таблицу вывода, как показано выше, и получитьbarplot, где ось X имеет «тип», а столбец представляет счетчик каждого столбца?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Просто используйте ?xtabs вместе с ?stack:

xtabs( ~ values + ind , stack(df1[,-1]))

или даже короче, как подсказывает @nicola:

table(stack(df1[,-1]))

для вас обоих:

#            ind
#values       Func.ensGene Func.genericGene Func.refGene
#  exonic                1                1            1
#  intergenic            5                5            2
#  intronic              0                0            3

Вы предпочитаете работать с фреймом данных?

as.data.frame.matrix(
    xtabs( ~ values + ind , stack(df1[,-1]))  # or again only table(stack(df1[,-1]))
)
0 голосов
/ 22 ноября 2018

Люблю базовые решения R, но используя data.table и немного magrittr для удобства чтения, вы можете получить data.frame напрямую (вместо таблицы):

library(magrittr)
library(data.table)
setDT(df)
df %>%
  melt(id.vars = "Key") %>%
  .[, .N, .(variable, value)] %>% 
  dcast(value ~ variable, value.var = "N", fill = 0)

        value Func.ensGene Func.genericGene Func.refGene
1:     exonic            1                1            1
2: intergenic            5                5            2
3:   intronic            0                0            3

Или гораздо более кратко (какпо предложению Хенрика):

dcast(melt(df, "Key"), value ~ variable)

Если вы предпочитаете функции обратного хода:

library(tidyr)
df %>%
  gather(key = Key) %>%
  group_by(Key, value) %>%
  count() %>%
  spread(Key, n, fill = 0)

# A tibble: 3 x 4
# Groups:   value [3]
  value      Func.ensGene Func.genericGene Func.refGene
  <chr>             <dbl>            <dbl>        <dbl>
1 exonic                1                1            1
2 intergenic            5                5            2
3 intronic              0                0            3

Данные:

df <- data.frame(
  Key              = 1:6, 
  Func.ensGene     = c("intergenic", "intergenic", "intergenic", "exonic", "intergenic", "intergenic"), 
  Func.genericGene = c("intergenic", "intergenic", "intergenic", "exonic", "intergenic", "intergenic"), 
  Func.refGene     = c("intergenic", "intergenic", "intronic", "exonic", "intronic", "intronic"),
  stringsAsFactors = FALSE
)
0 голосов
/ 22 ноября 2018

Мы можем получить все уровни unique из кадра данных и для каждого столбца вычислить счетчик каждого уровня, сначала преобразовав его в factor с уникальными уровнями, вычисленными ранее.

unique_names <- unique(unlist(df[-1]))
sapply(df[-1], function(x) table(factor(x, levels = unique_names)))

#           Func.ensGene Func.genericGene Func.refGene
#intergenic            5                5            2
#exonic                1                1            1
#intronic              0                0            3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...