Другая возможность tidyverse
:
repair_names(df, prefix = "cat", sep = "_") %>%
rowid_to_column() %>%
gather(var, val, -c(Sequence, position, rowid)) %>%
mutate(temp = sub("\\_.*", "", var)) %>%
arrange(rowid) %>%
group_by(Sequence, position, temp) %>%
summarise(res = sum(val),
rowid = first(rowid)) %>%
spread(temp, res) %>%
select(-rowid)
Sequence position cat1 cat2
<chr> <chr> <dbl> <dbl>
1 abfsgdfy a 1. 1.
2 abfsgdfy b 0. 3.
3 dgdtecgd b 2. 1.
Сначала изменяются имена столбцов, чтобы они имели префикс "cat"
и "_"
в качестве разделителя.Во-вторых, он преобразует данные из широкого формата в длинный.В-третьих, используя sub("\\_.*", "", var)
, он принимает строки перед "_"
.Затем он суммирует значения.Наконец, он возвращает данные в широкоформатном формате.
Использование примеров данных, предоставленных @svenhalvorson:
df <- tibble(c("abfsgdfy", "abfsgdfy", "dgdtecgd"),
c("a", "b", "b"),
c(0, 0, 1),
c(1, 0, 1),
c(0, 1, 1),
c(1, 1, 0),
c(0, 1, 0))
colnames(df) <- c("Sequence", "position", "cat1", "cat1", "cat2", "cat2", "cat2")