Агрегировать / суммировать / подсчитывать значения на основе идентичных имен столбцов или отдельных значений df в R - PullRequest
0 голосов
/ 11 декабря 2018

Я пытался сделать это несколькими различными способами (агрегат, colSum, подсчет и т. Д.), Но мне трудно.

У меня большой набор данных выборочных результатов (100 столбцов, 1 000 000 строк)где я заменил отдельные имена образцов на название категории, к которой они принадлежат.(Мне нужно подсчитать итоговые значения для каждой точки данных по категориям.

Sequence   position  cat1  cat1  cat2  cat2  cat2  cat3  cat3
abfsgdfy   a         0     1     0     1     0     1     1
abfsgdfy   b         0     0     1     1     1     1     0
dgdtecgd   b         1     1     1     0     0     0     0

Я понимаю, что нежелательно иметь одинаковые имена столбцов, поэтому я пытался транспонировать данные, а затемработать с ним. Но это тоже не слишком далеко зашло.

Вывод, который я ищу, будет выглядеть следующим образом:

Sequence  position  cat1  cat2  cat3
abfsgdfy   a        1     1     2 
abfsgdfy   b        0     3     1
dgdtecgd   b        2     1     0

Если это поможет, у меня естьтаблица, которая переводит названия примеров в большую группу категорий:

Type    Name
cat1    sample1
cat1    sample2
cat2    sample3
cat2    sample4
cat2    sample5
cat3    sample6
cat3    sample7

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Другая возможность 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")
0 голосов
/ 11 декабря 2018

Как насчет этого?

library("tidyverse")
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")

# rename column names to make them unique:
newcols = c("Sequence", "position", paste0("c", 1:(ncol(df)-2)))
oldcols = colnames(df)
colnames(df) = newcols

# make a crosswalk
col_cross = tibble(oldcols = oldcols,
                   newcols = newcols)

# gather the new columns, summarize across the old columns, spread
df %>% 
  gather(key = "newcols", value = "val", -Sequence, -position) %>% 
  left_join(col_cross) %>% 
  group_by(Sequence, position, oldcols) %>% 
  summarize(n = sum(val)) %>% 
  spread(key = oldcols, value = n, fill = 0)
...