Люблю базовые решения 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
)